2012-07-12 58 views
1

我有一个返回超过50k记录的查询结果。我这样做:从Rails数组中收集独特的活动记录对象?

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

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

+0

这是一个很好的问题,但.. – Trip 2012-07-12 12:21:44

回答

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 

只能通过遍历数组一次,并为您提供了两套与该领域的独特价值。虽然不知道它是否更快。

+6

我认为这将更快得到独特的元素直接在SQL查询中,而不是在Ruby中。 – tokland 2012-07-12 12:28:57

+0

很可能,特别是取决于索引,但我认为你需要每个属性的一个查询。 – 2012-07-12 12:36:38

+0

感谢您的快速响应。我根本没有想过套。这符合我的需求。我不能使用不同的SQL查询,因为我需要稍后使用结果。我认为最好只查询一次数据库,然后处理结果。 – Dennis 2012-07-12 13:17:17

10

选择独特的列值的纯Ruby/Rails的方法(没有硬编码SQL)是:

uniq_fields1 = Model.uniq.pluck(:field_1) 
# issues: SELECT DISTINCT field_1 FROM "models" 
0

伴随@ tokland的评论的线路:

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

由于@Frederick指出,是事实上有两个命中数据库,但会(可能)更快,如果你有这些领域的索引,几乎肯定会更快。

+0

你会得到关系,而不是价值(根据作者的代码,这是需要的)。 – jdoe 2012-07-12 13:04:16

+0

确实。交叉邮件再次让我。你有我'拔'。你让我'拔'。 – 2012-07-12 13:45:45

0

如果我没有误解的问题,uniq应该给你独一无二的对象,以及:

array_of_objects.uniq 

Documentation