2014-01-07 38 views
1

我正在尋找一種更有效的方式來編寫ActiveRecord查詢。我想獲得一個模型的所有實例,其中或者加入一個表另一個表。兩者都很容易,但要麼很困難。Rails:通過一個表或其他表加入

現在,我有以下兩個查詢:

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

(其次是不能令人滿意的clues = (across_clues + down_clues).uniq.sort_by{|clue| clue.id}

我不知道如何寫查詢,這將使我的工會我的兩個查詢。這樣我可以讓Postgres完成繁重的工作,並防止Rails弄髒手。

我知道如何讓路口兩套

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

,但我還沒有看到一個很好的方式來獲得他們的結合。任何幫助將不勝感激和愛!

回答

1

關鍵是你需要使用find_by_sqlUNION DISTINCT

我所以這裏MySQL的傢伙是我會怎麼做

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

什麼

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 

與Squeel?

1

(爲後人)

我使用UNION DISTINCT根據溼婆的回答,但只是略微修改它以減少硬編碼:

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})") 

它的工作原理!