2013-12-08 5 views
0

많은 버전이있는 assets이라는 테이블이 있습니다. 버전에는 버전 번호가 있습니다. 각 저작물에는 최신 (최신) 버전을 나타내는 version_number 열도 있습니다.레일즈 - 두 개의 매개 변수가있는 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에 '최신'을로드 할 수 없다는 것입니다. 또한 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 
} 

는 좀 열망 로딩 상황에서, SQL 키 VERSION_NUMBER에 대한 모호함에 대해 불평 때문에, 라인 "versions.version_number = version_number" 조금 조정할했다. 그래서, 나는 그 애매함을 제거하고 문제를 해결하기 위해 assets.을 추가했다. 나는 그들이 말한 것을 다시 되풀이 할 것인데, 이는 언제든지 joins(:latest) includes(:latest)!

관련 문제