2011-01-18 4 views
1

Projects, Users 및 Projects - Rsvps 및 Memberships에 연결할 수있는 두 가지 방법이 있다고 가정 해 보겠습니다. 그래서 같이 :두 개의 병렬 조인 모델을 레일에 연결

class User < ActiveRecord::Base 
    has_many :memberships 
    has_many :rsvps 
    has_many :projects, :through => :memberships 
end 

class Project < ActiveRecord::Base 
    has_many :memberships 
    has_many :rsvps 
    has_many :members, :through => :memberships, :class_name => 'User' 
end 

class Rsvp < ActiveRecord::Base 
    belongs_to :project 
    belongs_to :user 
end 

class Membership < ActiveRecord::Base 
    belongs_to :project 
    belongs_to :user 
end 

답장 및 멤버십 내가 특히 하나 개의 모델로 결합하고 싶지 않은 자신의 다른 기능에 충분한 다르지만, 내가 답장과 구성원을 연관 지을 수 있어야하고 싶어. 제 이상적인 시나리오는 다음과 같습니다.

class Membership < ActiveRecord::Base 
    has_one :rsvp, :through => [:project, :user] 
end 

분명히 그게 꿈입니다.

지금까지

def rsvp 
    project.rsvps.find(:conditions => {:user_id => user_id}) 
end 

처럼 뭔가 가짜 협회에하려고 생각했지만 그와 함께 모든 재미 다른 기능을 복제하지 않는 한 그 이상 이하의 두 가지 잠재적 인 솔루션

연관 개체. 또는 membership_id 필드를 Rsvp에 추가 할 수 있지만 동기화 관련 버그가있는 것처럼 보입니다.

더 좋은 아이디어가 있습니까?

 
has_one ... :conditions => lambda{ ['project_id = ? AND user_id = ?', self.project_id, self.user_id] } 

난 당신이 또한 속기 형식으로이 작업을 수행 할 수 있다고 생각하지만 작은 따옴표를 두 번하지 따옴표를 사용하는지 확인하십시오 has_one 또는 has_many 관계를 지정하는 조건 매개 변수 :

답변

0

당신은을 사용할 수 있습니다

+0

이것이 내가 제안한 두 번째 비 솔루션과 다른 점은 확실하지 않습니다. 둘 다 연관 개체가 아닌 Rsvp 개체를 생성합니다. – bhaibel

+0

사실 내 연관성이 실제로 생성되었음을 명확히하기 위해 내 게시물을 수정했습니다. 나는 find 함수 대신 association 선언에 : 조건을 사용할 것을 제안했다. –

+0

오! 죄송합니다. 그것은 거의 작동하지만, 두 개의 작은 조각 - 하나 :'~ => : 프로젝트, 조건 => 'user_id = # {user_id}''(또는 존재하지 않는 membership_id를 찾는다) 둘, has_one 소스가 : rsvp가 아닌 rsvps라고 지정해야했습니다. 궁극적으로, 협회는 : has_one : rsvp, : through => : project, : conditions => 'user_id = # {user_id}', : source => : rsvps'로 생성되었습니다. 일단 내가 그것을 해결하면, 그것은 완벽하게 작동했습니다. – bhaibel

관련 문제