2015-12-29 6 views
0

Пусть есть модель Item с атрибутами id, name и конкретная запись в БД с именем 'other'.Переместить определенный элемент в последнюю позицию

Как получить в одном запросе SQL объект ActiveRecord::Relation с элементами, отсортированными таким образом, чтобы other элемент в последней позиции? В качестве временного решения я использовал Item.where.not(name: 'other') + Item.where(name: 'other'), но он приводит к 2 запросам.

NB: это не настоящий код, а чрезвычайно упрощенный пример.

+0

вы могли бы использовать [жадную загрузку] (http://guides.rubyonrails.org/active_record_querying.html#eager-loading -ассоциации) – VKatz

+0

@Vinay, 'Eager Loading' для связанных записей. Это не такой случай. – yurko

ответ

0

Решенные с добавлением методы класса в Item модели:

def self.sorted 
    find_by_sql("SELECT * FROM items ORDER BY (CASE name WHEN 'other' THEN 0 ELSE 1 END) DESC, id ASC") 
end 
0

Возможно, что-то вроде ниже, поможет, - читаем мы все Item с, и использовать кусок для удаления Item с name равным other, и добавить его обратно в массив в конце.

a = Item.all.tap do |arr| 
    arr << arr.slice!(arr.index { |t| t.name == "other"}) 
end 
0

Если я получу вас правильно, тогда вы ищете SQL-запрос, не так ли? Тогда вы можете попробовать что-то вроде этого:

select id, name 
from (
    select id, name, decode(name, 'other', 999, 1) as sort 
    from items 
) 
order by sort 

У меня нет базы данных прямо сейчас, чтобы проверить утверждение. Но я думаю, что вы поняли эту идею.

Успехов

Смежные вопросы