2013-12-08 61 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)