cih*_*cih 2 ruby sql activerecord ruby-on-rails
所以我有一个活动的记录查询,返回一些记录,让我们说它看起来像这样.
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
Run Code Online (Sandbox Code Playgroud)
所以作业将显示它,deadline_date如果它不是零,它将回退使用due_date.所以要对此进行排序,我已经做了以下......
jobs.sort_by{|job| job.deadline_date}
jobs.sort_by{|job| job.deadline_date}.reverse
Run Code Online (Sandbox Code Playgroud)
这解决了我的问题,但我想知道有更好的选择,是否有可能使用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
Run Code Online (Sandbox Code Playgroud)
注意:这是一个任意的例子,实际上它有点乱,但你明白了.所以我正在寻找一种SQL替代方案或者如何改进它的建议.干杯
Jak*_*b S 16
如果我理解正确,您应该能够使用COALESCESQL函数执行此操作:
jobs.order("COALESCE(deadline_date, due_date)")
Run Code Online (Sandbox Code Playgroud)
这和deadline_date || due_dateRuby 非常相似.
我相信它是一个标准的SQL事物,所以它应该适用于大多数SQL方言.
| 归档时间: |
|
| 查看次数: |
1509 次 |
| 最近记录: |