2013-10-16 1 views
0

나는이 액티브 오브젝트 있습니다어떻게 ActiveRecord 객체가 다른 객체의 2 인스턴스를 별도의 속성으로 소유 할 수 있습니까?

  • ID
  • 이름
  • 이 clip_id

    위치

클립

  • ID
  • 이름

(간결성 - 난 단지이 질문에 관련된 속성을 나열했습니다)

현재 clip belongs_to location - 예상대로이 작동합니다.

그러나 이제는 내 프로젝트에서 Location이 2 clips을 소유해야합니다. 하나는 내가 listing_clip으로 이름을 짓고 하나는 description_clip으로하고 싶습니다. 어떻게해야합니까? 당신은 clips 테이블에 추가 열을 추가 할 수 있습니다

답변

3

가장 '올바른'방법은이 것입니다 locations 테이블의 외래 키 쌍은 clips 테이블을 가리 킵니다. 이를 위해 연관을 반대로하고 location 테이블에 listing_clip_iddescription_clip_id을 추가하십시오.

그런 다음, 수정하여 협회 :

class Location < ActiveRecord::Base 
    belongs_to :listing_clip, class_name: 'Clip' 
    belongs_to :description_clip, class_name: 'Clip' 
end 

class Clip < ActiveRecord::Base 
    has_one :listed_location, class_name: 'Location', foreign_key: 'listing_clip_id' 
    has_one :described_location, class_name: 'Location', foreign_key: 'description_clip_id' 
end 
+0

챔피언처럼 일했습니다. 환상적인 솔루션. 감사! – drewwyatt

+0

이 방법의 문제점은 다른 클립을 추가 할 때마다 테이블에 새 열을 추가해야한다는 것입니다. – Hamed

+0

@Hamed 예, 그렇게해야합니다. 이것은 일대 다 관계가 아닙니다. 일련의 일대일 관계입니다. 위치는 임의의 수의 클립과 관련된 것으로 가정되지 않습니다. – meagar

2

clip_type라는이 같은 Location 모델에 연결을 참조 : 데이터베이스에이를 모델링하기

class Location < ActiveRecord::Base 
    has_one :listing_clip, class_name: 'Clip', conditions: { clip_type: 'listing' } 
    has_one :description_clip, class_name: 'Clip', conditions: { clip_type: 'description' } 
end 

class Clip < ActiveRecord::Base 
    belongs_to :location 
end 
+1

여기서 'clip_type'은 선택 사항입니다. 나쁜 생각은 아니지만 필요하지 않습니다. –

+0

@ JimStewart 어떤 클립이 목록이고 설명이 무엇인지 알려주시겠습니까? – meagar

+0

'location.listing_clip'은 목록 클립으로 할당 된 것입니다. 클립 자체가 어떤 유형인지를 반드시 알아야 할 필요는 없습니다. –

0

사이 listing_clipdescription_clip의 속성 (즉 이름이 아닌) 동일하고 furture 차이를 예견하지 않으면 새와는 DRY 유지할 수 있습니다 클립의 열 clip_type :

class Location < ActiveRecord::Base 
    has_many :clips, limit: 2 
end 

class Clip < ActiveRecord::Base 
    attr_accessor :clip_type 
    belongs_to :location 
end 
관련 문제