etspring
@etspring
Начитанное быдло

Как изящно выполнить одну сортировку в RoR ( AR )?

Вечер в радость, чаек в сладость.

ENV: ruby 2.4.1 + ror 5.1.4 + postgresql

Имеется модель:
create_table "phones", force: :cascade do |t|
    t.integer "id"
    t.string "type"
    t.datetime "created_at"
  end

Поле type в модели может принимать всего 3 значения: ios, android, wp.
В таблице имеется ( к примеру ) 12 записей - по 4 каждого из type, созданных непоследовательно ( те. ios, ios, android, wp ... )
Требуется сделать, сортировку чтобы сначала выводился тип ios, отсортированный по created_at, далее android так же по created_at, ну и на сладкое wp.

Собственно можно решить так:
ordering_by_id = []
ordering_by_id << Phone.where(type: 'ios').order(created_at: :desc).select(:id) ....
ordering_by_id << Phone.where(type: 'android').order(created_at: :desc).select(:id) ....
@phones = Phone.where(id: ordering_by_id).order_as_specified(id: ordering_by_id)

Но думаю, есть более изящный вариант.

Заранее спасибо и плюс вам в карму!
  • Вопрос задан
  • 91 просмотр
Решения вопроса 1
HighQuality
@HighQuality
☁ Ниндзя девелопер
Сохраняйте тип, как rails enum. Поле в базе будет integer. Укажете в модели нужный порядок.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
b0nn1e
@b0nn1e
Alcohol & Ruby on Rails
Теоретически должно работать так
SELECT *
FROM phones
ORDER BY idx(array['ios','android','wp'], phones.type)


Но это не точно :)
А вообще вам тут нужно смотреть как это сделать на уровне базы, а не на уровне AR
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы