1

我有这个查询:

case_timeline = Case.select('cases.*, case_steps.*, tasks.*, task_statuses.*')
      .joins(case_steps: { tasks: :task_status} )
      .where('cases.id = ?', case_1.id)
      .where('task_statuses.task_status_name in (?)', ['Open', 'Overdue', 'Completed'])
      .order('tasks.end_date DESC')

completed_timeline =
case_timeline
.select{|task| task.task_status_name == "Completed" }

我怎样才能按日期订购?我试过这个:

completed_timeline =
case_timeline
.select{|task| task.task_status_name == "Completed" }
.order('end_date')

但它给出了错误:

undefined method `order' for #<Array:0x000000051da2e0>
4

2 回答 2

5

您希望在调用 select 之前调用对象上的 order 方法。

completed_timeline =
case_timeline.order('end_date')
.select{|task| task.task_status_name == "Completed" }

这是因为 case_timeline 返回一个知道如何响应订单的 ActiveRecord 对象,而调用 select 返回一个不知道如何响应订单的 Array 对象。

于 2013-07-27T18:00:28.903 回答
0

select使用块将ActiveRecord::Relation转换为Array;来自文档

你可以传递一个块,这样它就可以像Array#select. 这会从数据库中为作用域构建一个对象数组,将它们转换为数组并使用Array#select.

由于task_status_name似乎是一列,因此最好where避免将其完全转换为数组:

completed_timeline = case_timeline.where(task_status_name: 'Completed')
                                  .order('end_date')

或者,将select调用移至所有查询方法调用之后

于 2013-07-27T19:10:55.573 回答