Mongoid: найти через массив идентификаторов - PullRequest
8 голосов
/ 23 сентября 2011

Я получил несколько идентификаторов через MapReduce.Я отсортировал эти идентификаторы по некоторым критериям, и теперь мне нужно получить эти объекты в определенном порядке:

MyModel.find(ids)

Верно?Но он возвращает объекты не в том порядке, в котором хранятся идентификаторы.Похоже, это то же самое, что и

MyModel.where(:_id.in => ids)

, который не будет возвращать извлеченные объекты в том же порядке, что и сохраненные идентификаторы.

Теперь я могу сделать это

ids.map{|id| MyModel.find(id)}

, который выполнит эту работу, но много раз ударит по базе данных.

Ответы [ 2 ]

10 голосов
/ 05 июня 2012

Работал над похожей проблемой и нашел более краткое решение:

objs = MyModel.find(ids).sort_by{|m| ids.index(m.id) }

в основном просто использует блок сортировки, чтобы поймать индекс элемента.

9 голосов
/ 23 сентября 2011

Вы можете сделать заказ вручную после того, как у вас есть все ваши объекты. Примерно так:

ordering = { }
ids.each_with_index { |id, i| ordering[id] = i }
objs = MyModel.find(ids).sort_by { |o| ordering[o.id] }
...