2009-06-18 2 views
2

나는 관계를 통해 has_many :를 위해 훌륭하게 작동하는 this tutorial을 팔로우하고 있습니다. category_product와 같은 정상적인 일이 있습니다.ActiveRecord와 동일한 모델에 대한 다 대다 연관?

그러나이 상황을 개념화 할 수 없으며 작동하지도 못합니다. 관련 카테고리가있는 카테고리가 있습니다. 모든 카테고리가 N 개의 카테고리를 가질 수 있기 때문에, 우선 이것이 실제로는 다 대다 (many-to-many) 상황입니까? (나는 그것이 꽤 긍정적입니다)? 둘째, 어떻게 생겼을까요? 내 마이그레이션은 다음과 같습니다

create_table :categories do |t| 
    t.string :name 
    t.timestamps 
end 

create_table :related_categories, :id => false do |t| 
    t.integer :category_a_id 
    t.integer :category_b_id 
end 

내 모델의 내장은

has_many :related_categories, :foreign_key=>"category_a_id" 
has_many :categories, :through => :related_categories, :source=>:category_a 

있는이 거기 점점 불구하고 (즉, 그것은 100 % 생겼습니다), 분명 옳지 않다. 어떻게해야합니까?

편집

: 나는이 잊고 있지만 여기에 SO에 (의미는 답이 아니다) :

class RelatedCategory < ActiveRecord::Base 
    belongs_to :category_a, :class_name=>"Category" 
    belongs_to :category_b, :class_name=>"Category" 
end 

답변

2

당신은 당신의 has_many 선언에 :source => :category_b을 시도해야합니다.

관련 카테고리 테이블에 외래 키로 category_a_id을 이미 사용했습니다. 이것은 기본적으로 ActiveRecord가 related_categories 테이블의 category_a_id 필드를 현재의 Category 개체 ID와 일치 시키도록 지시합니다.이 필드와 관련된 모든 related_categories 레코드를 가져옵니다. 이 has_many :through 선언에 대한 소스 매개 변수는 카테고리 컬렉션을 채울 때 관련 객체를 찾거나 (관련하여 쓰려면) 고려해야 할 필드를 지정합니다.

+0

+1 감사합니다. 그 일은하지 않았지만 나는 다시 전체 관계를 보려고합니다. CategoryA를 사용했을 때 실제로 효과가 있었지만 관계의 다른면은 절대로 얻지 못했습니다. 좀 더 테스트 할거야. –

+0

죄송합니다. 귀하의 답변은 맞지만 절반은 이야기입니다. 나머지 절반은 내 답변에 (아래) ...하지만 그래, 아주 멋진, 고마워. –

0

여기에 답이 있지만 꽤 좋지는 않습니다.

has_many :related_categories, :foreign_key=>"category_a_id" 
    has_many :related_categories2, :class_name=>"RelatedCategory", :foreign_key=>"category_b_id" 
    has_many :categories, :through => :related_categories, :source=>:category_b 
    has_many :categories_backwards, :through => :related_categories2, :source=>:category_a 
    has_many :category_products 

그러면 카테고리 + categories_backwards 또는 뭔가를 결합하는 구티 게터를해야 할 것입니다.

[2 분 후] 편집 : 와우, 게터가 거의 완벽 해 보인다! 물론, 문제는 당신이 게터에서 얻는 것이 아니라 카테고리로 푸시해야한다는 것입니다.

관련 문제