2015-06-26 2 views
1

Я хочу отсортировать мое место, где условие приводит к тому, что я передаю значения в массиве. то, что я делаю, у меня есть массив идентификаторовRails Сортировка записи на основе массива, переданного в том месте, где условие

ids = [80, 20, 3, 91, 84, 90, 98, 97, 68, 99, 92, 73] 

Когда я передаю этот массив, где состояние как:

products = Product.where(id: ids) 

его возвращение результата активной записи соотношение в другом порядке (в случайном порядке) что-то вроде:

=>[ 20 ,84, 3,98 , .............. ] 

(это активный объект записи отношение я имею упомянуть только идентификаторы здесь)

Но я хочу, чтобы вернуть объект в том порядке, я передавая значения как (в активной записи отношения объекта не массив)

=> [80, 20, 3, 91, 84, 90, 98, 97, 68, 99, 92, 73] 

Как я могу это сделать.

+0

хотите отсортировать его по порядку, в котором я передаю его в массив не по идентификатору –

ответ

0

Ответ для MySQL только

Существует функция в MySQL называется FIELD()

Таким образом, вы можете сделать что-то вроде

products = Product.where(id: ids).order("field(id, #{ids.join ','})") 
+0

Ищу Postgress на самом деле. есть ли какой-либо способ достичь такого же острого постулата. –

0

Я получил решение этого просто нужно

В модели продукта внутри продукта.rb file put:

def self.order_by_ids(ids) 
    order_by = ["case"] 
    ids.each_with_index.map do |id, index| 
     order_by << "WHEN id='#{id}' THEN #{index}" 
    end 
    order_by << "end" 
    order(order_by.join(" ")) 
    end 

И запрос будет:

products = Product.where(:id => ids).order_by_ids(ids) 

Здесь идентификаторами будет массив идентификаторов

0

Просто сортировать с помощью индексов вашего IdS массива:

products = Product.where(id: ids).sort_by { |prod| ids.index(prod.id) } 

Плюс это база данных агностик , и это нормально делать в Ruby, так как в любом случае у вас не будет миллионов идентификаторов.

+0

На самом деле это вернет массив неактивных отношений записи. –

0

В Postgres

hot_offer_ids = ["7081", "7083", "6917", "5075"] 
values = '' 
hot_offer_ids.each_with_index do |offer_id, index| 
    values += ", " if index > 0 
    values += %((#{offer_id}, #{index})) 
end 
hot_offers = Offer.joins("join (VALUES #{values}) as x(id, ordering) on offers.id = x.id").order("x.ordering") 
Смежные вопросы