2013-03-11 84 views
0

我有3種型號:Rails的嵌套/多級AREL查詢

Tiersets 
    has_many Tiers 

Tiers 
    belongs_to Tierset 
    has_and_belongs_to_many Features 

Feature 
    has_and_belongs_to_many Tiers 

Feature,我有一個名爲Feature_Code一個String列包含以下字符串之一: 「F_VIZ」, 「F_DATA」,「 F_SCORE「。

我試圖構造查詢發現,已知Tierset內,一切的一切Tier對象爲TiersetFeature對象的代碼F_VIZ

我已經嘗試了一堆組合:包括AREL查詢,但我很明顯混淆了表如何加入。任何幫助深表感謝。

回答

1

你想要的SQL是

select * from features, features_tiers, tiers where features_tiers.id = features.id and features_tiers.tier_id = tiers.id and features.code = 'F_VIZ' AND tierset_id = ?; 

所以我們會直接轉化這ActiveRecord的:

Feature.joins(:tiers).where(:code => 'F_VIZ', 'tiers.tierset_id' => 1) 

這是一個有點清潔,因爲AR「知道」有關的隱含的連接表功能和層次取決於您的關聯設置。

+0

謝謝,這工作。請注意,我不得不稍微修改它,因爲我沒有直接搜索'F_VIZ',而是對於代碼名稱中有'VIZ'的記錄(也是尋找唯一記​​錄,因此在末尾添加了.uniq):' Feature.where(「code like?」,「%VIZ%」)。joins(:tiers).where(「tiers.tierset_id」=> 1).uniq' – tarunsachdeva 2013-03-11 23:18:26

+0

雖然有一件奇怪的事情發生。在上面的查詢中,'.count'實際上也返回了所有非唯一條目的計數,而不僅僅是唯一的。不知道這是因爲我的db(Postgres)以不同的方式處理連接。它不是任務關鍵,不會影響我的應用程序......但這很奇怪。 – tarunsachdeva 2013-03-11 23:22:28

+1

您應該使用'.length'而不是'.count'。前者將在Ruby中進行評估,而後者將在數據庫中評估爲COUNT(*)。 – bdon 2013-03-12 03:18:42