12

제품이 있고 제품에 많은 이미지가있을 수 있습니다. 이것은 연관 테이블을 통해서입니다. 그러나 제품에 하나의 주 이미지가 있기를 원합니다.레일 has_many 연관의 has_one

이 모델의 메서드를 사용하면 매우 쉽게 알 수 있지만이 모델을 연관으로 설정하여 include을 사용하여 쿼리에 미리로드 할 수 있습니다.

모델 다음 ImageAssociation 테이블에서

class Product < ActiveRecord::Base 
    has_many :image_associations, :as => :imageable 
    has_many :images, :through => :image_associations 
end 

class ImageAssociation < ActiveRecord::Base 
    belongs_to :image 
    belongs_to :imageable, :polymorphic => true 
end 

class Image < ActiveRecord::Base 
    has_many :image_associations 
end 

에서 '주'의 이미지로 이미지를 연관 '기능'라는 컬럼 부울있다.

belongs_to :image, :class => "Image", :foreign_key => "main_image_id" 

그러나,이 모든 대체를 허용하지 않습니다 나는 Image 모델에 추가 한 후 제품 테이블에 main_image_id 열을 추가하고이 일을,하고 생각 한 가지 방법

하나 주 이미지가 nil 인 경우 다른 이미지에 has_many 이미지가로드됩니다. 내가 좋아하는 이미지 모델에서 뭔가를 기대 한 이유

입니다 :

has_one :image, :through => :images, :conditions => 'feature = true', :order => 'created_at DESC' 

그러나 그것은 나에게 연결 오류를 제공합니다.

has_one을 편집 할 수있는 방법이 있습니까? 아니면 모든 rake 작업을 실행하여 모든 main_image_id 필드에 이미지를 넣은 다음 나중에 제품에 대한 유효성 검사를 추가하여 주 이미지가 추가되었는지 확인해야합니까? ?

편집 :

내가 대신 has_and_belongs_to_many 연결을 사용해야 하는가?

답변

13

당신은 거의 다 왔다고 생각합니다. 그러나 나는 다형성 협회에서 그렇게 명확하지 않습니다. 다음과 같은 것을 원합니다.

has_one :main_image_assoc, class => "ImageAssociation", :conditions => 'feature = true', :order => 'created_at DESC', :as => :imageable 
has_one :image, :through => :main_image_assoc 
+0

아니요. 원하는 경우 컬렉션에 대해 다른 필터링 된 has_many 연관을 사용하여이를 수행 할 수 있지만 has_one은 지정하지 않습니다. 이 오류가 발생합니다 :'ActiveRecord :: HasOneThroughCantAssociateThroughCollection : has_one : through 연관 'Article # image'를 가질 수 없습니다 : through association 'Article # image_associations'는 콜렉션입니다. 대신 : through 옵션에 has_one 또는 belongs_to 연관을 지정하십시오. '이미 시도했습니다. –

+0

아, 볼 수 있습니다. 내가 편집 해 볼까. – Chowlett

+1

첫 줄 수정 - : has_one : main_image_assoc, : class_name => "ImageAssociation", : order => 'feature = true', : as => : imageable' ... 이것은 폴백 (및 올바른 구문) . 감사! –