2015-03-18 5 views
0

У меня есть метод, который сортирует коллекцию массив ids как так:Rails 4: сбор сортировать по массиву идентификаторов

def selected_components 
    ids = @document.publications.rank(:position).map(&:component_id) 
    Component.find(ids).sort_by { |c| ids.index(c.id) } 
end 

Это прекрасно работает, но я хочу, чтобы отсортировать результат на порядка ids максимально эффективно. Видимо, мой метод не самый эффективный, хотя я не 100%, почему это так.

Почему это не так эффективно? Любой совет? Спасибо.

ответ

1

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

Во-первых, нетерпеливые публикации нагрузки с его компонентами:

@document = Document.includes(publications: :component).find_by(...) 

Тогда ранжируются и отображающие компоненты:

def selected_components 
    @document.publications.rank(:position).map(&:component) 
end 

Теперь selected_components не нужно делать доступа к БД. Кроме того, вам не нужно сортировать данные два раза, только один (в ранге).

Отредактировано: Ожидаемая нагрузка, рекомендуется использовать для исправления проблемы n + 1 here.

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