我有一个返回超过 50k 记录的查询结果。我愿意 :
@array.collect {|x| x.field_name1}.uniq, @array.collect {|x| x.field_name2}.uniq
..为视图中的多个选择创建过滤器。这需要相当长的时间。有什么方法可以在一个循环中收集所有独特元素以提高性能?谢谢
我有一个返回超过 50k 记录的查询结果。我愿意 :
@array.collect {|x| x.field_name1}.uniq, @array.collect {|x| x.field_name2}.uniq
..为视图中的多个选择创建过滤器。这需要相当长的时间。有什么方法可以在一个循环中收集所有独特元素以提高性能?谢谢
用于选择唯一列值的纯 Ruby/Rails 方法(没有硬编码 SQL)将是:
uniq_fields1 = Model.uniq.pluck(:field_1)
# issues: SELECT DISTINCT field_1 FROM "models"
就像是
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
仅遍历数组一次,并为您提供两个具有该字段唯一值的集合。不确定它是否更快。
按照@tokland 的评论:
[:field1, :field2].map { |f| YourTable.select(f).uniq }
正如@Frederick 所指出的,这确实是对数据库的两次点击,但(可能)会更快,并且如果您在这些字段上有索引,几乎肯定会更快。