Ruby on rails 从Rails中的阵列收集唯一的活动记录对象?

Ruby on rails 从Rails中的阵列收集唯一的活动记录对象?,ruby-on-rails,ruby,ruby-on-rails-3,Ruby On Rails,Ruby,Ruby On Rails 3,我有一个返回超过50k条记录的查询结果。我有: @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 |

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

@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
unique_field_1_values=Set.new
唯一\u字段\u 2\u值=Set.new
@数组。每个do | x|
唯一的\u字段\u 1 \u值类似

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
unique_field_1_values=Set.new
唯一\u字段\u 2\u值=Set.new
@数组。每个do | x|
用于选择唯一列值的唯一字段值值纯Ruby/Rails方法(无硬编码SQL)将是:

uniq_fields1 = Model.uniq.pluck(:field_1)
# issues: SELECT DISTINCT field_1 FROM "models"
选择唯一列值的纯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所指出的,这确实是db的两次点击,但是(可能)会更快,而且如果你在这些字段上有索引,几乎肯定会更快。

按照@tokland的评论:

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

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

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

array_of_objects.uniq

如果我没有误解这个问题,
uniq
也应该为您提供独特的对象:

array_of_objects.uniq

这是个好问题..这是个好问题..我认为直接在SQL查询中获取唯一元素会更快,而不是在Ruby中。很可能,特别是根据索引,尽管我认为每个属性都需要一个查询。感谢您的快速响应。我根本没想过布景。这符合我的需要。我不能使用独特的sql查询,因为我需要在以后使用结果。我认为最好只查询一次数据库,然后处理结果。我认为直接在SQL查询中获取唯一元素会更快,而不是在Ruby中。很可能,特别是根据索引,尽管我认为每个属性都需要一个查询。感谢快速响应。我根本没想过布景。这符合我的需要。我不能使用独特的sql查询,因为我需要在以后使用结果。我认为最好只查询数据库一次,然后处理结果。你会得到关系,而不是值(从作者的代码判断,这是需要的)。事实上。交叉柱又把我抓住了。你让我在
弹拨
。你让我在
弹拨
。你得到的是关系,而不是价值(从作者的代码判断,这是需要的)。事实上。交叉柱又把我抓住了。你让我在
弹拨
。你让我在
弹拨