1

我有一个组表,其中包含一个“容量”列,并且与 Enrollments 具有 has_many 关系。我希望能够找到注册人数少于其容量的组,因此使用 ActiveRecord + Ruby 我可以这样做:

Group.all.select {|g| g.enrollments.count < g.capacity }.first

但似乎应该有一种方法可以在 SQL 中做到这一点,我只是不知道怎么做。有任何想法吗?

4

2 回答 2

1

执行此操作的纯 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 的背后创建注册。

于 2012-04-07T09:42:07.897 回答
0

可以使用 :counter_cache 选项。

  1. 在 Groups 表中添加一个enrollments_count 列

    column :groups, :enrollments_count, :integer, :default => 0
    
  2. 设置 Enrollment 的 :counter_cache 选项

    class Enrollment < ActiveRecord::Base
      belongs_to :group, :counter_cache => true
    end
    
  3. Group.where("容量 > 注册数").first

于 2012-04-07T09:34:25.850 回答