2012-10-16 3 views
1

내 신청서는 Users, Stories, CompetitionsSubmissions 인 서면 경쟁 모델입니다.Rails에서 여러 연관을 쿼리하는 올바른 방법은 무엇입니까?

사용자는 제출을 통해 대회에 참가하거나 소유자로 참가할 수 있습니다. 사용자가 소유하거나 참여한 모든 대회를 반환하는 쿼리 나 메서드를 원합니다. 배열로 반환하는 메서드가 있는데, competitions | owned_competitions이지만 체인, 범위 등을 적용 할 수 있도록 ActiveRecord 엔터티를 유지하고 싶습니다.

더 좋은 방법이 있습니까? 이러한 관계를 설정하는 방법은 무엇입니까?

내 모델은 다음과 같이 :

user.rb :

has_many :stories 
has_many :submissions 
has_many :competitions, :through => :submissions 
has_many :owned_competitions, :class_name => "Competition" 

story.rb :

belongs_to :user 
has_many :submissions 
has_many :competitions, :through => :submissions 

competition.rb :

belongs_to :owner, :class_name => "User", :foreign_key => 'user_id' 
has_many :submissions 
has_many :competitors, :through => :submissions, :source => :user 
has_many :stories, :through => :submissions 

scope :expiring_today, lambda { where("deadline = ?", Date.today) } 

submission.rb을 :

belongs_to :user 
belongs_to :story 
belongs_to :competition 
+0

왜 downvotes? 나는 최선의 방법을 이해하려고 노력하는 약 40 가지의 다른 질문을 검색하여 해결하지 못했습니다 ... – Heliostatic

답변

1

원하는 것은 사실입니다. 사실, SQL을 작성하지 않고도 가능할 수도 있지만 정확히 어떻게 알지는 못합니다.

Competition.joins('left join submissions on submissions.competition_id = competitions.id').where('competitions.user_id = :uid OR submissions.user_id = :uid', :uid => user) 

우리는 왼쪽을 사용하여 우리는 여전히 사용자가있는 제외한 아직 제출이없는 소유 대회를 반환 할 수 있도록 (오히려 내부 조인 기본보다) 가입 : 내가 가지고 올 한 내용을 여기에

입니다 .

+0

이것은 완벽하게 감사합니다. 나는 이것을 User 모델의 클래스 메소드로 정의했다. 내 모델과 관계가 의미가 있습니까, 아니면이 관계를 설정하는 더 좋은 방법이 있습니까? – Heliostatic

+0

모델과 연결에 문제가없는 것은 아니지만 결국 실제 테스트는 "이게 논리적으로 보이나요?"라는 것이 아니라 "필요한 작업을 쉽게/효율적으로 수행 할 수 있습니까?"라고 말합니다. – MrTheWalrus

관련 문제