「容量」列があり、登録とhas_manyの関係にあるグループのテーブルがあります。登録数が容量より少ないグループを見つけたいので、ActiveRecord +Rubyを使用してこれを行うことができます:
Group.all.select {|g| g.enrollments.count < g.capacity }.first
しかし、SQLでこれを行う方法があるはずのようです。方法がわかりません。何か案は?
「容量」列があり、登録と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
またはactiverecordで
Group.joins(:enrollments).group('groups.id').having('count(*) < capacity)
カウンター列にインデックスがあるカウンターキャッシュは高速になりますが、明らかにacriverecordの背後に登録を作成する必要はありません。
:counter_cacheオプションを使用できます。
enrollments_count列をGroupsテーブルに追加します
column :groups, :enrollments_count, :integer, :default => 0
登録の:counter_cacheオプションを設定します
class Enrollment < ActiveRecord::Base
belongs_to :group, :counter_cache => true
end
Group.where( "capacity> enrollments_count")。first