2017-01-19 1 views
0

내 Track.rb 모델에 다음 코드가 있습니다. 더 많은 레일스 구문을 사용하여 이것을 작성하는 방법이 있습니까? 3.2이 SQL 쿼리를 Rails 3.2 구문으로 작성하는 방법은 무엇입니까?

@track = Track.find(7) 


Submission.joins("LEFT JOIN missions ON missions.id = submissions.mission_id") 
      .joins("LEFT JOIN tracks ON tracks.id = missions.track_id") 
      .where("missions.track_id = ?", track.id) 

모델 레일을 사용하여 임 : 모든

Track.rb 
    has_many :missions 

Mission.rb 
    belongs_to :track 
    has_many :submissions 

Submission.rb 
    belongs_to :mission 
+0

당신이 이러한 모델 사이의 관계가 있습니까 : 이런 생각으로

, 당신은 당신의 코드를 다시 작성할 수 있을까? 그렇다면 '포함한다'는 방법입니다. – tadman

+0

그렇습니다. 내 모든 모델이 올바르게 설정되었습니다. –

+0

만약 그렇다면 필요한 데이터를 eager-loading하여 해당 'belongs_to'유형 관계를 실행할 수 있습니다. 'includes '는 관련된 것을 다시 정의하는 모든 혼란없이 조인을 추가하는 효과가 있습니다. 조금 실험하고 생성 된 쿼리를 확인하십시오. 'has_many : missions, through : tracks'와 같은 것을 설정하여 처음부터 적절한 관계를 만들 수 있습니다. – tadman

답변

1

첫째, 당신이 정말로 missions 조인 왼쪽해야합니까? missions.track_id으로 필터링하므로 임무없이 제출하지 않아도됩니다. 이 경우 내부 조인이 더 적절할 것입니다.

다음으로, 왜 tracks에 가입해야합니까? 다음 sql에서이 테이블을 사용하지 마십시오.

Submission.joins(:mission).where(missions: { track_id: track.id }) 
+0

그게 전부 완벽하게 작동! –