我有两个分别由has_many和belongs_to association关联的公司和角色模型。我需要找一家角色完全正确的公司。
我想出了
Company.joins(:roles).having("'count(roles.id) = ?', 3")
但这不起作用。对此有没有积极的记录解决方案?
感谢。
答案 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协会的连接表。