Ruby on Rails: поиск записей без сортировки - PullRequest
6 голосов
/ 23 августа 2011

Мне нужно найти записи в точном порядке, поскольку они передаются в качестве параметра поиска.

Например, у меня есть строка:

item_list = "23,12,54,45"

С помощью следующего запроса я получаю записи в порядке asc 'item_list' - "12,23,45,54".

Inventory.find(item_list.split(","))

Как изменить указанный выше запрос таким образом, чтобы он возвращал записи в том же порядке, что и 'item_list'.

Спасибо.

Ответы [ 4 ]

5 голосов
/ 23 августа 2011

Попробуйте, хотя это может работать только в MySQL:

Inventory.where("id IN (#{item_list})").order("find_in_set(id, '#{item_list}')")

Для небольших наборов данных вы можете позволить Ruby отсортировать результаты, но я думаю, что база данных сделает работу за вас лучше всего подходит для больших наборов.

1 голос
/ 23 августа 2011

Выполните сортировку на стороне клиента следующим образом:

ids   = item_list.split(',')
items = Inventory.find(ids).sort_by { |i| ids.index(i.id) }

При этом используется только один запрос, а sort_by вычисляет блок только один раз для каждого элемента, поэтому часть не должнаэто будет так дорого.Если вам нужно иметь дело с множеством элементов, вы можете легко создать Hash, который отображает идентификатор на его индекс и использовать его в блоке sort_by.

Основная идея состоит в сортировке одного массива с использованиемструктура другого, например:

>> a = [ 23, 11, 42, 5 ]
>> b = [5, 23, 11, 42]
>> b.sort_by { |i| a.index(i) }
=> [23, 11, 42, 5]
0 голосов
/ 23 августа 2011
 unordered_records = Inventory.where(:id => item_list)
 item_list.collect { |id| unordered_records.detect { |x| x.id == id } }
0 голосов
/ 23 августа 2011
item_list.split(",").collect do |item|
  Inventory.find(item)
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...