从Rails中的数组中收集唯一的活动记录对象?

时间:2012-07-12 12:13:09

标签: ruby-on-rails ruby ruby-on-rails-3

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

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

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

4 个答案:

答案 0 :(得分:10)

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

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

答案 1 :(得分: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

只迭代数组一次,并为您提供两组具有该字段的唯一值。不确定它是否更快。

答案 2 :(得分:0)

按照@ tokland的评论:

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

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

答案 3 :(得分:0)

如果我没有误解这个问题,if(Mage::registry('current_category')){ $catid = Mage::registry('current_category')->getId(); $cat = Mage::getModel('catalog/category')->load($catid); } else { //because sometimes we can not use registry('current_category'), so we use: $cat_ids = $_product->getCategoryIds(); // get all categories where the product is located $cat = Mage::getModel('catalog/category')->load( $cat_ids[0] ); // load first category } 也应该给你独特的对象:

uniq

Documentation