2011-02-09 2 views
0

나는 has_and_belongs_to_many 매크로를 통해 연관된 모델 X와 모델 Y를 가지고있다. 데이터베이스에는 모델 X와 모델 Y 사이의 다 대다 관계에 대한 데이터가 유지되는 테이블이 있습니다.레일즈 3 모델에서 시리얼 조인; 다 - 대 - 다 관계를 통해 어떻게 연관 시키는가?

또한 모델 A와 has_many 매크로를 통해 연결된 모델 A도 있습니다.

objectA.kind_of? ModelA = true 
objectX.kind_of? ModelX = true 
objectY.kind_of? ModelY = true 

내가 objectA.objectYs를 실행할 수 싶어 돌아왔다 :의 나는 다음과 같은 개체가 있다고 가정 해 봅시다, 즉, 그래서 모델 A.와 관련된 모든 모델 Y 객체에 도달하는 매우 간단한 명령을 실행합니다 나 [objectY].

이 작업을 수행하려면 모델 정의에 무엇을 입력해야합니까?

(나는 모델 (A)에 배치 시도했다 :.. (1) has_many :modelY하고, (2) has_many :modelY, :through => :modelX 둘 권리 없음)

답변

1

경고 : 일반적으로 하나는 왜곡 된 모델 이름을 사용하지 않을 것입니다. 모델을 가정

는 다음과 같다 :

class ModelA < ActiveRecord::Base 
    has_many :model_xes 
end 

class ModelX < ActiveRecord::Base 
    belongs_to :model_a 
    has_and_belongs_to_many :model_ies, :class_name => 'ModelY', 
    :join_table => 'model_x_model_ies' 
end 

class ModelY < ActiveRecord::Base 
    has_and_belongs_to_many :model_xes, :class_name => 'ModelX', 
    :join_table => 'model_x_model_ies' 
end 

우리의 ModelY의를 얻을 수있는 범위를 만들 수있는 모든 ModelX의 모델 (A)에 속하는 :

class ModelY < ActiveRecord::Base 
    scope :find_by_a, lambda { |a| joins(:model_xes).\ 
    where(:model_xes=>{:model_a_id=>a.id})} 
end 

후 간단한 방법 ModelA 인스턴스의 범위를 호출하십시오.

class ModelA < ActiveRecord::Base 
    def ys 
    ModelY.find_by_a(self) 
    end 
end 

테스트 :

require 'spec_helper' 

describe ModelA do 
    before(:each) do 
    @a = ModelA.create(:name=>"a") 
    2.times { @a.model_xes.create(:name=>"x") } 
    end 

    it "relates model_x" do 
    @a.model_xes.count.should == 2 
    end 

    it "relates model y" do 
    x = @a.model_xes.first 
    x.model_ies.create 
    x.model_ies.count.should == 1 
    end 

    it "relates model y through model x" do 
    @a.model_xes.each do |x| 
     2.times { x.model_ies.create(:name=>"y") } 
    end 
    ys = @a.ys 
    ys.count.should == 4 
    ys.all? { |y| y.name == "y" }.should be_true 
    end 
end 

HABTM은 부끄럽지 않으므로 대신 has_many :through을 사용하는 것이 좋습니다.

+0

매우 도움이되는 답변에 대해 감사드립니다. –

관련 문제