sql - Rails 根据一列和另一列(如果为空)对事件记录结果进行排序

标签 sql ruby-on-rails ruby activerecord

所以我有一个返回一些记录的事件记录查询,假设它看起来像这样。

jobs = Job.where(:user_id => current_user.id)

如您所料,这将返回 current_user 的工作。假设作业有两个日期,deadline_datedue_date。如果我想在 deadline_date 订购,我可以做类似的事情..

jobs.order("deadline_date asc")

这按预期工作,现在想象一下我在工作模型中有这样的东西。

class Job < ActiveRecord::Base
 def deadline_date
  self.read_attribute(:deadline_date) || self.due_date
 end
end

所以作业将显示其 deadline_date 如果它不是 nil 否则它将回退到使用 due_date。所以为了对此进行排序,我做了以下事情......

jobs.sort_by{|job| job.deadline_date}
jobs.sort_by{|job| job.deadline_date}.reverse

这解决了我的问题,但我想知道是否有更好的选择,是否可以使用 SQL 来实现?这也会产生一些重复的代码,因为我的 Controller 中有一个 sort_order 变量,我可以像这样直接传递...

jobs.order(sort_order)

现在看起来更像是这样了......

if params[:sort] == "deadline_date"
 if params[:order] == "asc"
  jobs.sort_by{|job| job.deadline_date}
 else
  jobs.sort_by{|job| job.deadline_date}.reverse
 end
else
 jobs.order(sort_order)
end

注意:这是一个任意的例子,实际上有点乱,但你明白了。所以我正在寻找 SQL 替代方案或有关如何改进它的建议。干杯

最佳答案

如果我没理解错的话,您应该能够使用 COALESCE SQL 函数来完成此操作:

jobs.order(Arel.sql("COALESCE(deadline_date, due_date)"))

这与 deadline_date || 几乎相同Ruby 中的截止日期

我相信它是一个标准的 SQL 东西,所以它应该适用于大多数 SQL 方言。

关于sql - Rails 根据一列和另一列(如果为空)对事件记录结果进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19660108/

相关文章:

ruby-on-rails - 通过 ruby​​ OpenURI 下载文件时间歇性 EOFError

ruby-on-rails - Ruby On Rails - 在 Controller 中使用关注点

ruby - 使用#include 将对象与自身进行比较时不使用自定义 == 运算符?

sql - SSIS Oracle Source 只输出 1 个字符

mysql - 外连接多个表

ruby-on-rails - 删除数据库中除最后 x 行以外的所有行

ruby - 当存在字符 r 时,读取文件会导致问题

ruby - 日期 strptime 返回无效日期

sql - PostgreSQL:获取与表相关的所有功能

sql - 指定两个排序索引?