我有一个方法可以按类似ids
数组对集合进行排序:
def selected_components
ids = @document.publications.rank(:position).map(&:component_id)
Component.find(ids).sort_by { |c| ids.index(c.id) }
end
这很好用,但我希望尽可能高效地按ids
的顺序对结果进行排序。显然我的方法不是最有效的,虽然我不是百分之百的原因。
为什么这不高效?有什么建议?非常感谢。
答案 0 :(得分:1)
我很确定:如果你有效地搜索,你必须让数据库完成工作。
首先,急切加载出版物及其组件:
@document = Document.includes(publications: :component).find_by(...)
然后对组件进行排名和映射:
def selected_components
@document.publications.rank(:position).map(&:component)
end
现在,selected_components不需要进行数据库访问。此外,您不需要对数据进行两次排序,只需一次(排名)。
已修改:急切加载,建议将其作为修复n + 1问题here的最佳做法。