我正在寻找一种更有效的方式来编写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)
但我还没有看到一个很好的方式来获得他们的联盟。任何帮助都会受到赞赏和喜爱!
答案 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_sql
和UNION 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?