我有一个返回超过50k记录的查询结果。我这样做:从Rails数组中收集独特的活动记录对象?
@array.collect {|x| x.field_name1}.uniq, @array.collect {|x| x.field_name2}.uniq
..在视图中为几个选择创建过滤器。 需要相当长的一段时间。有什么方法可以在一个循环中收集所有独特的元素以提高性能? 感谢
我有一个返回超过50k记录的查询结果。我这样做:从Rails数组中收集独特的活动记录对象?
@array.collect {|x| x.field_name1}.uniq, @array.collect {|x| x.field_name2}.uniq
..在视图中为几个选择创建过滤器。 需要相当长的一段时间。有什么方法可以在一个循环中收集所有独特的元素以提高性能? 感谢
喜欢的东西
unique_field_1_values = Set.new
unique_field_2_values = Set.new
@array.each do |x|
unique_field_1_values << x
unique_field_2_values << x
end
只能通过遍历数组一次,并为您提供了两套与该领域的独特价值。虽然不知道它是否更快。
选择独特的列值的纯Ruby/Rails的方法(没有硬编码SQL)是:
uniq_fields1 = Model.uniq.pluck(:field_1)
# issues: SELECT DISTINCT field_1 FROM "models"
伴随@ tokland的评论的线路:
[:field1, :field2].map { |f| YourTable.select(f).uniq }
由于@Frederick指出,是事实上有两个命中数据库,但会(可能)更快,如果你有这些领域的索引,几乎肯定会更快。
你会得到关系,而不是价值(根据作者的代码,这是需要的)。 – jdoe 2012-07-12 13:04:16
确实。交叉邮件再次让我。你有我'拔'。你让我'拔'。 – 2012-07-12 13:45:45
这是一个很好的问题,但.. – Trip 2012-07-12 12:21:44