根据第三个属性,按不同属性对ActiveRecord集合进行排序

时间:2018-10-23 17:38:50

标签: ruby-on-rails activerecord rails-activerecord

我有一个具有以下属性的Order模型:

  • created_at DateTime
  • 交货时间 DateTime
  • 状态 字符串

我要尝试的是根据created_at的{​​{1}}或delivery_at对两个集合进行排序。

在模型上,我创建了一种检查状态顺序并返回statuscreated_at日期时间的方法。

delivery_at

然后在控制器中:

def status_date
  if status == 'on_delivery'
    delivered_at.to_datetime
  else
    created_at.to_datetime
  end
end

哪个不起作用。

我正在尝试按时间顺序排列订单,但DateTime应该与其状态相关。

1 个答案:

答案 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中将是必需的)。