我有兩個模型公司和角色分別由has_many和belongs_to關聯。我需要取得一個擁有「n」個角色的公司。根據關聯對象數有效記錄查詢
我想出了
Company.joins(:roles).having("'count(roles.id) = ?', 3")
但這不起作用。有沒有一個積極的記錄解決方案?
謝謝。
我有兩個模型公司和角色分別由has_many和belongs_to關聯。我需要取得一個擁有「n」個角色的公司。根據關聯對象數有效記錄查詢
我想出了
Company.joins(:roles).having("'count(roles.id) = ?', 3")
但這不起作用。有沒有一個積極的記錄解決方案?
謝謝。
協會 -
作用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)
在PostgreSQL中,您可以使用類似select company_fk from roles GROUP BY company_fk HAVING COUNT(company_fk) = 3;
之類的東西。
不知道這是否適用於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協會的加入表格。
謝謝。但我想盡可能避免使用複雜查詢的形式。 – prasvin 2012-01-31 04:21:54
我知道這是不是你要找的答案,但最好的(在性能方面)的解決方案是一個簡單的roles_count
列添加到companies
表,然後添加:counter_cache => true
到belongs_to的關聯聲明。 Rails負責爲您更新該列。
然後,
Company.where("roles_count = ?", 3)
的更多信息:http://guides.rubyonrails.org/association_basics.html#belongs_to-counter_cache
+1,完全忘了 – 2012-01-31 08:25:46
+1是的,這是一個很好的解決方案。幾乎已經忘記了這一點。謝謝。 – prasvin 2012-01-31 11:55:02
我認爲如果我們預計有太多的關聯記錄,counter-cache會提高性能,否則可能會造成負擔過重。說啥 ?? – 2012-01-31 18:50:25
看起來像我大錯特錯的關聯。你可以把協會放在你的公司和榜樣中。 – 2012-01-30 12:42:28
這些協會是一個公司有很多角色和角色屬於一個公司。我希望這個就足夠了。 – prasvin 2012-01-31 04:16:51
根據上述關聯尋找修改後的答案 – 2012-01-31 07:30:40