所以我有一个活动的记录查询返回一些记录,让我们说它看起来像这样。
jobs = Job.where(:user_id => current_user.id)
正如您所期望的那样,它会返回current_user的作业。假设作业有两个日期deadline_date
和due_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实现这一点?这也会产生一些重复的代码,因为我的控制器中有一个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备选方案,或者建议如何改进它。干杯
答案 0 :(得分:16)
如果我理解正确,您应该可以使用COALESCE
SQL函数执行此操作:
jobs.order("COALESCE(deadline_date, due_date)")
这与Ruby中的deadline_date || due_date
几乎相同。
我认为它是标准的SQL事物,所以它适用于大多数SQL方言。