所以我有一个返回一些记录的活动记录查询,假设它看起来像这样。
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
因此,如果它不是 nil,则作业将显示它deadline_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 替代方案或关于如何改进它的建议。干杯