Rails:通过一个表或另一个表连接

时间:2014-01-07 02:51:36

标签: ruby-on-rails activerecord join union rails-activerecord

我正在寻找一种更有效的方式来编写ActiveRecord查询。我想获取模型的所有实例 加入一个表另一个表。两者都很简单,但要么很难。

现在,我有以下两个问题:

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)

但我还没有看到一个很好的方式来获得他们的联盟。任何帮助都会受到赞赏和喜爱!

3 个答案:

答案 0 :(得分:2)

(后代)

我根据shiva的回答使用了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})")

有效!

答案 1 :(得分: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)")

答案 2 :(得分: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?