1

「容量」列があり、登録と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

またはactiverecordで

Group.joins(:enrollments).group('groups.id').having('count(*) < capacity)

カウンター列にインデックスがあるカウンターキャッシュは高速になりますが、明らかにacriverecordの背後に登録を作成する必要はありません。

于 2012-04-07T09:42:07.897 に答える
0

:counter_cacheオプションを使用できます。

  1. enrollments_count列をGroupsテーブルに追加します

    column :groups, :enrollments_count, :integer, :default => 0
    
  2. 登録の:counter_cacheオプションを設定します

    class Enrollment < ActiveRecord::Base
      belongs_to :group, :counter_cache => true
    end
    
  3. Group.where( "capacity> enrollments_count")。first

于 2012-04-07T09:34:25.850 に答える