1

我有一个返回超过 50k 记录的查询结果。我愿意 :

@array.collect {|x| x.field_name1}.uniq, @array.collect {|x| x.field_name2}.uniq 

..为视图中的多个选择创建过滤器。这需要相当长的时间。有什么方法可以在一个循环中收集所有独特元素以提高性能?谢谢

4

4 回答 4

11

用于选择唯一列值的纯 Ruby/Rails 方法(没有硬编码 SQL)将是:

uniq_fields1 = Model.uniq.pluck(:field_1)
# issues: SELECT DISTINCT field_1 FROM "models"
于 2012-07-12T12:47:59.603 回答
4

就像是

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

仅遍历数组一次,并为您提供两个具有该字段唯一值的集合。不确定它是否更快。

于 2012-07-12T12:26:23.007 回答
0

按照@tokland 的评论:

[:field1, :field2].map { |f| YourTable.select(f).uniq }

正如@Frederick 所指出的,这确实是对数据库的两次点击,但(可能)会更快,并且如果您在这些字段上有索引,几乎肯定会更快。

于 2012-07-12T12:54:23.317 回答
0

如果我没有误解这个问题,uniq也应该给你独特的对象:

array_of_objects.uniq

文档

于 2017-04-18T10:00:07.620 回答