我有一个具有以下属性的Order
模型:
我要尝试的是根据created_at
的{{1}}或delivery_at
对两个集合进行排序。
在模型上,我创建了一种检查状态顺序并返回status
或created_at
日期时间的方法。
delivery_at
然后在控制器中:
def status_date
if status == 'on_delivery'
delivered_at.to_datetime
else
created_at.to_datetime
end
end
哪个不起作用。
我正在尝试按时间顺序排列订单,但DateTime应该与其状态相关。
答案 0 :(得分:1)
您可以通过一次查询两个状态,然后使用SQL CASE表达式进行排序来在数据库中完成所有操作:
case status
when 'open' then created_at -- if the status is open then use created_at
else delivered_at -- otherwise use delivered_at
end
您只有两个状态,所以这些分支就足够了。
将它们放在一起:
orders = Order.where(status: %w[open on_delivery])
.order(Arel.sql("case status when 'open' then created_at else delivered_at end"))
需要Arel.sql
来获得经过#order
的SQL字符串,而不会在Rails5中引起投诉(在Rails6中将是必需的)。