活动记录查询取决于关联对象的数量

pra*_*vin 4 mysql activerecord ruby-on-rails ruby-on-rails-3.1

我有两个模型公司和角色分别由has_many和belongs_to协会相关.我需要获得一个拥有正确数量角色的公司.

我想出来了

Company.joins(:roles).having("'count(roles.id) = ?', 3")
Run Code Online (Sandbox Code Playgroud)

但这不起作用.有没有积极的记录解决方案?

谢谢.

San*_*ing 9

协会 -

角色belongs_to:公司

公司has_many:角色

因此,标准的选择将是 -

Company.joins(:roles).group(:company_id).having('count(company_id)= ?', 3)
Run Code Online (Sandbox Code Playgroud)

要么

Company.joins(:roles).group(:company_id).having('count(*)= ?', 3)
Run Code Online (Sandbox Code Playgroud)


bri*_*ker 5

我知道这不是您正在寻找的答案,但最好的(在性能方面)解决方案是向表中添加一个简单的roles_countcompanies,然后添加:counter_cache => true到belongs_to关联声明.Rails负责为您更新该列.

然后,

Company.where("roles_count = ?", 3)
Run Code Online (Sandbox Code Playgroud)

更多信息:http://guides.rubyonrails.org/association_basics.html#belongs_to-counter_cache