[英]Rails order active record results based on one column and another if null
所以我有一个返回一些记录的活动记录查询,可以说它看起来像这样。
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
,否则它将回due_date
使用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 替代方案或关于如何改进它的建议。 干杯
如果我理解正确,您应该可以使用COALESCE
SQL 函数执行此操作:
jobs.order(Arel.sql("COALESCE(deadline_date, due_date)"))
这与deadline_date || due_date
几乎相同deadline_date || due_date
Ruby 中的deadline_date || due_date
日期。
我相信它是一个标准的 SQL 东西,所以它应该适用于大多数 SQL 方言。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.