2013-12-08 96 views
0

我有一個稱爲擁有多個版本的資產的表。版本有版本號。每個資產還有一個version_number列,表示最新(最新)版本。Rails - has_one與兩個參數的關聯

我想建立資產與其最新版本之間的關聯,但我找不到有關如何執行此操作的任何文檔。這將在理論上,像這樣

asset.rb

has_one :latest, class_name: "Version", foreign_key: ["asset_id", "version_number"], primary_key: ["id", "version_number"] 

一個天真的做法是:

asset.rb

def latest 
    Version.where(asset_id: asset.id, version_number: asset.version_number).first 
end 

只有這樣做的問題就像代碼中那樣,是我無法加載資產的association_cache中的'latest'。當我加載一組資產時,我也無法輕鬆加載所有關聯的「最新」記錄,如Asset.includes(:latest).where(project_id: 7)

我認爲這個應該是可能的原因是因爲多態關聯使用兩個參數。

回答

0

在輸入我的問題後,我確實發現瞭解決方案,這有助於我更好地解決問題。解決方案來自於http://pivotallabs.com/rails-associations-with-multiple-foreign-keys/

TLDR;

has_one :latest, class_name: 'Version', foreign_key: :asset_id, primary_key: :id, conditions: Proc.new{|join_association| 
    if join_association 
    "versions.version_number = assets.version_number" 
    else 
    {version_number: version_number} 
    end 
} 

我不得不調整線路"versions.version_number = version_number"了一下,因爲在一些急於加載的情況下,SQL會抱怨模糊性爲重點的version_number。因此,我添加了assets.以消除歧義並解決問題。我會再次呼應他們所說的話,那就是你必須joins(:latest)只要你includes(:latest)