使用"或"连接activerecord关系条件

时间:2016-09-12 14:36:53

标签: ruby-on-rails ruby activerecord

我有两个问题

urgent = MassScanTask.joins(:mass_scan_list).where("mass_scan_lists.urgent = ? AND mass_scan_lists.enabled = ?", true, true).order("updated_at DESC")
not_urgent = MassScanTask.joins(:mass_scan_list).where("mass_scan_lists.urgent = ? AND mass_scan_lists.enabled = ? ", false, true).order("updated_at ASC")

如何使用单个查询将urgent + not_urgent全部放在一起?或者也许有一些方法可以将一个添加到另一个。我已经尝试了concat但它返回了数组,我需要activerecord关系,我也尝试了merge但它什么也没有返回。

1 个答案:

答案 0 :(得分:1)

因此,查看这些查询,您似乎需要enabled表中的所有mass_scan_lists行,但唯一的区别是排序。您希望所有urgent to come first, ordered by updated_at desc and then have非紧急ordered by updated_at`。

所以,我只想在order语句中使用一些自定义SQL。您没有指定您正在使用的RDBMS,但如果它是PostgreSQL,它将如下所示:

tasks = MassScanTask \ .joins(:mass_scan_list) \ .where(mass_scan_lists: { enabled: true }) \ .order('case urgent when true then -1 * extract(epoch from updated_at) else extract(epoch from updated_at) end')

此订单子句使用CASE statement,并非所有数据库都支持,但您使用的任何内容都可能有类似的条款。