Rails 4:按ID数组排序集合

时间:2015-03-18 01:00:00

标签: ruby-on-rails arrays sorting ruby-on-rails-4

我有一个方法可以按类似ids数组对集合进行排序:

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

这很好用,但我希望尽可能高效地按ids的顺序对结果进行排序。显然我的方法不是最有效的,虽然我不是百分之百的原因。

为什么这不高效?有什么建议?非常感谢。

1 个答案:

答案 0 :(得分:1)

我很确定:如果你有效地搜索,你必须让数据库完成工作。

首先,急切加载出版物及其组件:

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

然后对组件进行排名和映射:

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

现在,selected_components不需要进行数据库访问。此外,您不需要对数据进行两次排序,只需一次(排名)。

已修改:急切加载,建议将其作为修复n + 1问题here的最佳做法。