2014-11-23 1 views
0

activerecord으로 다음과 같은 SQL을 만들고 싶습니다. 내 문제는 로직 루프에 걸려있어 아직 결합되지 않은 테이블을 LEFT OUTER JOIN에 연결할 수 없으며 조인 실패로 내 진입 점을 찾을 수 없다는 것입니다.외부가 조인되지 않은 모델을 연결합니다.

activerecord 내가 시도하고 있습니다.

AdMsgs.joins("LEFT OUTER JOIN shows ON ad_msgs.user_id = shows.id OR ad_msgs.user_id = shows.b_id ") 
     .joins("LEFT OUTER JOIN m ON m.user_id = users.id OR m.m_id = shops.id OR m.m_id = shows.b_id") 
     .joins("LEFT OUTER JOIN users ON ad_msgs.to = users.email OR ad_msgs.user_id = users.id OR users.id = m.user_id") 
        .where("shows.id = ?", self.id) 
        .distinct("ad_msgs.id") 

는 쿼리는 두 번째 조인 (I 아직 가입하지 않았습니다 아마 때문에)하지만 난 사용자에 따라 m 기록을 선택해야합니다에 이용자들이 무엇을 알고하지 않습니다 없다는 오류를 출력

AdMsgs에는 두 테이블 중 하나와 연관이 없습니다.

은 완전 외부에 방법이이 3 개 테이블 조인 다음 사람에게 적절한 선택인가 (또는 더 나은 방법을?)

+0

이것은 잘못된 SQL을 생성합니다 ... 이것을 사용하려면 to_sql을 사용하십시오. – PinnyM

+0

self.id에 오류가 발생할 수 있습니다. 이 쿼리는 쇼 모델 –

+0

에서 DB 설계 문제처럼 보입니다. 내가 생각할 수있는 것은 INNER JOIN이 모든 테이블을 결합하고 WHERE 절의 모든 기준을 제공하는 것과 같았습니다. – mask8

답변

0

같은 시나리오를 구현하는 데 사용할 find_by_sql.

그렇지 않으면 joins과 같이 Blog.joins(articles: :comments)을 사용할 수 없다면 아마도 뭔가 나쁜 일을하거나 find_by_sql을 대신 사용하십시오.

복잡한 경우에는 논리를 검증하기 위해 먼저 SQL에 내 쿼리를 작성합니다. 하나의 복잡한 쿼리를 두 개의 간단한 쿼리로 대체하는 것이 종종 번잡합니다 (IN(*ids) 사용).

+0

은 많은 수의 ID가있을 때 IN (* ids) 효율입니까? 게으른로드 레일 것인가? –

관련 문제