2014-01-07 2 views
1

ActiveRecord 쿼리를 작성하는보다 효율적인 방법을 찾고 있습니다. 하나의 테이블을 합치는 테이블 또는 다른 테이블을 합치는 모델의 모든 인스턴스를 가져 오려고합니다. 둘 다 쉽지만 어느 쪽도 어렵습니다. 나에게 노동 조합을 줄 것이다 단일 쿼리를 작성하는 방법을 내가 궁금하네요레일 : 한 테이블 또는 다른 테이블에 합류

(불만족 clues = (across_clues + down_clues).uniq.sort_by{|clue| clue.id} 얹는)

across_clues = Clue.joins(:across_cells) 
down_clues = Clue.joins(:down_cells) 

:

는 지금, 나는 다음과 같은 두 가지 질문이 내 검색어 모두의. 그렇게하면 나는 Postgres가 무거운 짐을 들게하고 Rails가 손을 더럽히는 것을 막을 수있다.

은 내가 교차로 두 세트의 얻는 방법을 알고

bad_clues = Clue.joins(:across_cells, :down_cells) 

을하지만 노조를 얻을 수있는 좋은 방법을 보지 못했다. 어떤 도움을 주시면 감사하겠습니다.

답변

1

열쇠는 당신이 find_by_sqlUNION DISTINCT

을 사용할 필요가있다 나는 그래서 여기에 MySQL의 사람이 내가

내가 UNION DISTINCT를 사용하는 것이

Clue.find_by_sql("(SELECT clue.* FROM clue 
         INNER JOIN across_cell ON across_cell.clue_id=clue.id) 
        UNION DISTINCT 
        (SELECT clue.* FROM clue 
         INNER JOIN down_cell ON down_cell.clue_id = clue.id)") 
+0

위대한 작품 - 난 그냥 약간 아래 내 대답에 표시된대로 그것을 수정했습니다. 감사! – Dylan

0

무엇 Squeel와

across_clues = Clue.joins(:across_cells) 
down_clues = Clue.joins(:down_cells) 

Clue.where do 
(id.in across_clues.select{id}) | (id.in down_clues.select{id}) 
end 

어떻습니까?

1

(후손을 위해) 할 것 어떻게 생각 shiva의 대답에 따르면, 덜 하드 코딩되도록 약간 수정했습니다 :

across_query = Clue.joins(:across_cells).to_sql 
down_query = Clue.joins(:down_cells).to_sql 
clues = Clue.find_by_sql("(#{across_query}) UNION DISTINCT (#{down_query})") 

그것은 작동합니다!

관련 문제