2011-12-03 5 views
2

나는 개념 상으로는 어려움을 겪고있다. 나는 (놀랍지도 않게) 미디어의 조각을 나타내는 클래스 Media을 가지고있다. 이제 Media을 소유 한 여러 클래스가 있습니다. 예를 들어 QuestionMedia 개체를 소유 할 수 있으며 AnswerMedia 개체를 소유 할 수도 있습니다.belongs_to 클래스 집합

소유 클래스의 방향에서 모델을 만들려고하면 쉽습니다. 적절한 has_one 또는 has_many 연관을 부여하기 만하면됩니다. 그러나, 나는 다른 방향으로 고투하고있다. 미디어가 belong_to 어떤 특정 클래스도 아니며 클래스 집합 중 하나에 속할 수 있습니다.

나는 모호성의 순간에 적절한 것은 단지 belongs_to 연관을 가진 수업에 주석을 달지 않는 것이라고 생각합니다. 그러나이를 확인하는 문서를 찾을 수 없습니다.

답변

2

당신이 찾고있는 것은 다형성 관계입니다.

class Media < ActiveRecord::Base 
    belongs_to :mediable, :polymorphic => true 
end 

class Question < ActiveRecord::Base 
    has_many :media, :as => :mediable 
end 

class Answer < ActiveRecord::Base 
    has_many :media, :as => :mediable 
end 

동일한 미디어가 둘 이상의 모델에 속할 수있는 비슷한 질문에 답했습니다. 그 대답이 유용 할 것입니다. https://stackoverflow.com/a/8237597/367611

1

당신이하고있는 일은 교본 다형성 연관입니다. 가이드는 그들에게 좋은 점을 가지고있다.

http://guides.rubyonrails.org/association_basics.html#polymorphic-associations

는 연관에 약간 더 향상된 비틀림 다형성 연관된다. 다형성 연관을 사용하면 하나의 모델이 하나 이상의 다른 모델에 속할 수 있습니다. 예를 들어, 직원 모델 또는 제품 모델 중 하나에 속하는 그림 모델을 가질 수 있습니다.

+0

좋은 답변이지만 인라인 된 예는 내 생각에 다음 인터넷 사용자가 더 쉽게 만들 수 있습니다. – idbentley

1

아무것도 정말이 일을하지 못하도록없는 것으로 나타났습니다해야합니다

그러나

class Media < ActiveRecord::Base 
    belongs_to :question 
    belongs_to :answer 
end 
,이 방법의 가장 큰 단점은 미디어 테이블에 두 널 (NULL) 외래 키 열이해야한다는 것입니다 - question_idanswer_id.

다른 클래스에 미디어를 연결하려면 다른 null 허용 가능 외래 키 열을 미디어 테이블에 추가해야합니다.

이 문제를 해결하기 위해 Rails는 다형성 연관성을 사용합니다.이를 사용하면 단일 결합을 통해 여러 다른 모델에 속할 수 있습니다.

그래서 지금 당신은 당신의 질문에 @Sean 힐의 대답에로 연결을 모델링 할 수 있습니다 :

class Media < ActiveRecord::Base 
    belongs_to :mediable, :polymorphic => true 
end 

class Question < ActiveRecord::Base 
    has_many :media, :as => :mediable 
end 

# etc. 

한 열 쌍의 다형성 협회 대표 할 미디어 테이블 : mediable_id (일부 정수) 및 mediable_type를 ('질문'또는 '답변').

당신은 또한 관련 마이그레이션에 열을 추가해야 함을 잊지 마세요합니다 (CreateMedia 마이그레이션 - 필요에 따라 조정) :

t.integer :mediable_id 
t.string :mediable_type 

또는 더 간단을, 하나 개의 컬럼 :

t.references :mediable, :polymorphic => true