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

时间:2012-01-30 11:19:08

标签: mysql ruby-on-rails activerecord ruby-on-rails-3.1

我有两个分别由has_many和belongs_to association关联的公司和角色模型。我需要找一家角色完全正确的公司。

我想出了

Company.joins(:roles).having("'count(roles.id) = ?', 3")

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

感谢。

4 个答案:

答案 0 :(得分:8)

协会 -

角色belongs_to:公司

公司has_many:角色

因此,标准的选择是 -

Company.joins(:roles).group(:company_id).having('count(company_id)= ?', 3)

OR

Company.joins(:roles).group(:company_id).having('count(*)= ?', 3)

答案 1 :(得分:5)

我知道这不是您正在寻找的答案,但最好的(在性能方面)解决方案是在roles_count表中添加一个简单的companies列,然后添加{ {1}}到belongs_to关联声明。 Rails负责为您更新该列。

然后,

:counter_cache => true

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

答案 2 :(得分:0)

在PostgreSQL中,您可以使用类似select company_fk from roles GROUP BY company_fk HAVING COUNT(company_fk) = 3;的内容。

答案 3 :(得分:0)

不知道这是否适用于mysql,但您可以尝试类似:

Company.joins( <<-SQL_SCRIPT, 3 )
  INNER JOIN ( 
               SELECT    "company_id", COUNT("*")
               FROM      "company_roles"
               GROUP BY  "company_id"
             )
          AS  "filter"
          ON  "filter"."company_id" = "companies"."id"
          AND "filter"."count" = ?
SQL_SCRIPT                   

。 其中company_roles将成为HABTM协会的连接表。