Сортировать коллекцию ActiveRecord по различным атрибутам в зависимости от третьего атрибута - PullRequest
0 голосов
/ 23 октября 2018

У меня есть Order модель с такими атрибутами:

  • create_at DateTime
  • delivery_at DateTime
  • status String

Я пытаюсь отсортировать две коллекции по created_at или delivery_at в зависимости от status.

В модели я создал метод, который проверяет порядок статуса и возвращает created_at или delivery_at datetime.

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

А потом в контроллере:

created = Order.where(status: 'open')
on_delivery = Order.where(stauts: 'on_delivery')

orders = created + on_delivery
orders.sort_by(&:status_date)

Что не работает.

Я пытаюсь составить хронологический список заказов, но DateTime должен быть связан с его статусом.

1 Ответ

0 голосов
/ 23 октября 2018

Вы можете сделать все это в базе данных, запросив оба состояния одновременно, а затем используя выражение 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 необходим для получения строки SQL после #order без жалоб в Rails5 (и будет обязательным в Rails6).

...