如何通过关联计数过滤?

时间:2009-10-14 04:04:40

标签: sql ruby-on-rails activerecord

假设我的模型看起来像这样:

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

我如何获得所有含有10个或更多条形的泡沫(因此有10个或更多个蛋糕)?

2 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分: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' )