2012-01-30 42 views
3

我有兩個模型公司和角色分別由has_many和belongs_to關聯。我需要取得一個擁有「n」個角色的公司。根據關聯對象數有效記錄查詢

我想出了

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

但這不起作用。有沒有一個積極的記錄解決方案?

謝謝。

回答

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

看起來像我大錯特錯的關聯。你可以把協會放在你的公司和榜樣中。 – 2012-01-30 12:42:28

+0

這些協會是一個公司有很多角色和角色屬於一個公司。我希望這個就足夠了。 – prasvin 2012-01-31 04:16:51

+0

根據上述關聯尋找修改後的答案 – 2012-01-31 07:30:40

0

在PostgreSQL中,您可以使用類似select company_fk from roles GROUP BY company_fk HAVING COUNT(company_fk) = 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協會的加入表格。

+0

謝謝。但我想盡可能避免使用複雜查詢的形式。 – prasvin 2012-01-31 04:21:54

5

我知道這是不是你要找的答案,但最好的(在性能方面)的解決方案是一個簡單的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

+0

+1,完全忘了 – 2012-01-31 08:25:46

+0

+1是的,這是一個很好的解決方案。幾乎已經忘記了這一點。謝謝。 – prasvin 2012-01-31 11:55:02

+0

我認爲如果我們預計有太多的關聯記錄,counter-cache會提高性能,否則可能會造成負擔過重。說啥 ?? – 2012-01-31 18:50:25