我有两个问题
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
但它什么也没有返回。
答案 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,并非所有数据库都支持,但您使用的任何内容都可能有类似的条款。