2009-10-14 3 views
3

Скажем, у меня есть модели, которые выглядят следующим образом:Как фильтровать по количеству ассоциаций?

class Foo < ActiveRecord::Base 
    has_many :bars, :through => :cakes 
    has_many :cakes 
end 

class Bar < ActiveRecord::Base 
    has_many :foos, :through => :cakes 
    has_many :cakes 
end 

class Cake < ActiveRecord::Base 
    belongs_to :foo 
    belongs_to :bar 
end 

Как бы я все Foos, которые имели более 10 бар (и, следовательно, 10 или более торты)?

ответ

5
Foo.all(:joins => :cakes, 
    :group => "cakes.foo_id", 
    :having => "count(cakes.bar_id) >= 10") 
+4

Вы можете ускорить этот процесс с помощью counter_cache. Foo.find (: all,: conditions => ['foo.cake_count> 10']) – jonnii

1

ОК, я попытался ответить выше, но возникла проблема.

для наших целей Отец has_many: сыновья, хорошо?

Я хотел найти отцов, у которых было нулевых сыновей.

выше не работал, потому что он создал внутреннее соединение ... таким образом, отфильтровывая всех отцов без сыновей.

следующее сделал для меня работа:

Father.includes(:sons).group('fathers.id').having('count(sons.id)=0')

, и это также происходит работать для любого другого фильтра, который вы бы требовать

Father.includes(:sons).group('fathers.id').having('count(sons.id)=3')

Смежные вопросы