2017-01-12 2 views
0

У меня есть модель со следующими четыре областей:MySQL заказа по сгруппированным датам диапазонов

scope :active, -> { where("start_at <= '#{Time.now.utc}' AND end_at > '#{Time.now.utc}'") } 
scope :ended, -> { where("end_at < '#{Time.now.utc}'") } 
scope :coming_soon, -> { where("start_at > '#{Time.now.utc}' AND start_at < '#{Time.now.utc+6.hours}'") } 

Я хочу, чтобы быть в состоянии сделать что-то вроде (псевдокод, просто пытаюсь дать представление):

Model.all.order(active, coming_soon, ended) 

Результатом будет все строки из этой таблицы, отсортированные по строкам, удовлетворяющим сначала ограничениям active, а затем следуя ограничениям coming_soon и, наконец, всем, связанным с ограничениями ended.

ответ

1

я добавил следующую сферу, и это, кажется, решить мою проблему:

scope :time_sorted, -> { 
    select("events.*, CASE 
     WHEN start_at <= '#{Time.now.utc}' AND end_at > '#{Time.now.utc}' THEN 1 
     WHEN end_at < '#{Time.now.utc}' THEN 2 
     WHEN start_at > '#{Time.now.utc}' AND start_at < '#{Time.now.utc+6.hours}' THEN 3 ELSE 4 
     END AS formula") 
    .order("formula ASC") 
} 
Смежные вопросы