我有一个返回超过50k记录的查询结果。我这样做:
@array.collect {|x| x.field_name1}.uniq, @array.collect {|x| x.field_name2}.uniq
..为视图中的多个选择创建过滤器。 这需要一段时间。有什么方法可以在一个循环中收集所有独特元素以提高性能? 感谢
答案 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