2015-02-13 2 views
1

мне нужно отсортировать список задач:ActiveRecord пункт условного заказа

|----------------------------------------------------------------------| 
| title       | priority | due_at    | 
| ---------------------------------|-------------|---------------------| 
| Mow the lawn     |   1 | 2011-09-11 22:00:00 | 
| Call mom      |   3 | 2010-01-26 09:29:03 | 
| Bake a cake      |   2 | 2013-09-13 08:45:37 | 
| Feed the cat     |   2 | 2015-09-12 16:03:51 | 
| Remember you don't like the cat |   2 | 2014-03-19 23:00:00 | 
|----------------------------------------------------------------------| 

Оговорка порядок должен сортировать просроченные задачи по приоритету, а все остальные по due_at, например, полученный заказ должен быть

  • косить газон
  • испечь торт
  • Зов мама
  • Помните, что вы не любите кота
  • Кормите кошку

ответ

1

Я закончил с следующей (простой SQL, еще не переведенной на АР):

SELECT * 
FROM tasks 
ORDER BY 
    due_at <= Now() DESC, 
    CASE due_at <= Now() WHEN true THEN priority END ASC, 
    CASE due_at <= Now() WHEN true THEN due_at END ASC, 
    CASE due_at <= Now() WHEN false THEN due_at END DESC, 
    CASE due_at <= Now() WHEN false THEN priority END ASC 
0

Если вы просто нужен массив задач, хранящихся в @tasks, вы можете сделать это:

@tasks = Task.where(due_at: 10.years.ago..Time.now).order(:priority) 
@tasks += Task.where.not(due_at: 10.years.ago..Time.now).order(:due_at) 

Если вам нужен Task::ActiveRecord_Relation вы должны будете сделать это:

Task.where(id: Task.where(due_at: 10.years.ago..Time.now). 
       order(:priority).pluck(:id) + 
       Task.where.not(due_at: 10.years.ago..Time.now). 
       order(:due_at).pluck(:id)) 
Смежные вопросы