我有一个组表,其中包含一个“容量”列,并且与 Enrollments 具有 has_many 关系。我希望能够找到注册人数少于其容量的组,因此使用 ActiveRecord + Ruby 我可以这样做:
Group.all.select {|g| g.enrollments.count < g.capacity }.first
但似乎应该有一种方法可以在 SQL 中做到这一点,我只是不知道怎么做。有任何想法吗?
我有一个组表,其中包含一个“容量”列,并且与 Enrollments 具有 has_many 关系。我希望能够找到注册人数少于其容量的组,因此使用 ActiveRecord + Ruby 我可以这样做:
Group.all.select {|g| g.enrollments.count < g.capacity }.first
但似乎应该有一种方法可以在 SQL 中做到这一点,我只是不知道怎么做。有任何想法吗?
执行此操作的纯 SQL 方式是
select groups.* from groups
inner join enrollments on enrollments.group_id = groups.id
group by groups.id
having count(*) < capacity
或在活动记录中
Group.joins(:enrollments).group('groups.id').having('count(*) < capacity)
但是,在计数器列上具有索引的计数器缓存会更快,尽管显然您不必在 acriverecord 的背后创建注册。
可以使用 :counter_cache 选项。
在 Groups 表中添加一个enrollments_count 列
column :groups, :enrollments_count, :integer, :default => 0
设置 Enrollment 的 :counter_cache 选项
class Enrollment < ActiveRecord::Base
belongs_to :group, :counter_cache => true
end
Group.where("容量 > 注册数").first