2011-01-05 36 views
1

Product具有以下属性:Rails:如何过滤和分类产品?

  • 模型
  • 价格

Model属于:

  • 品牌

鉴于@products,如:

Shop Brand Model Price 
---- ----- ----- ----- 
Ebay Sony  S-100 500 
Ebay Sony  S-200 1000  (in Target it's cheaper) 
Ebay Dell  D-55  300 
Target Sony  S-100 600   (in Ebay it's cheaper) 
Target Sony  S-200 900 
Amazon Dell  D-33  100 

我想只过滤那些用最低的价格,也就是我期望能获得:

Shop Brand Model Price 
---- ----- ----- ----- 
Ebay Sony  S-100 500 
Ebay Dell  D-55  300 
Target Sony  S-200 900 
Amazon Dell  D-33  100 

,最好通过Brand进行排序,然后通过Model

Shop Brand Model Price 
---- ----- ----- ----- 
Ebay Sony  S-100 500 
Target Sony  S-200 900 
Amazon Dell  D-33  100 
Ebay Dell  D-55  300 

我该怎么做?

回答

0

你对数据库特定的排序感到满意吗?

@products.order('brand_id, price') 

编辑:过滤器和秩序

EDIT2:不是指数,而是一群由模型

EDIT3:排序品牌,然后再模拟

EDIT4:不要停止,直到有范围改进。更好的多字段排序

def lowest_priced(products) 
    # All products are grouped by the model (key is model, value is array of products belonging to that model) 
    per_model = products.group_by{|x|x.model} 
    # Hash of lowest products per model 
    lowest = {} 
    per_model.keys.each do |model| 
    # Find lowest priced product for the model 
    lowest[model] = per_model[model].min_by{|p| p.price} 
    end 
    # Sort the values of the hash 
    return lowest.values.sort_by{|p| [p.model.brand,p.model]} 
end 

您会理想地重构上面的代码,以便每个函数只有一个责任。

+0

它应该过滤吗? – 2011-01-05 13:23:56

+0

啊!所以你需要根据model_id进行分组,挑选最低价格然后排序。您可以在数据库中使用时髦的查询来做到这一点,但是它是否可移植是很危险的。我会用ruby解决方案更新我的答案(请注意,这意味着所有记录都将被提取)。 – 2011-01-05 13:32:52

+0

选择所有记录并使用所有这些可枚举的方法将会变得非常缓慢,并带来大量数据并带来不必要的复杂性。除非你知道你只处理少量的数据,否则我会不惜一切代价避免这种技术。 – idlefingers 2011-01-05 16:46:59

0

使用searchlogic gem。它会生成很多搜索和排序的范围。例如

Product.search(:order => :ascend_by_model) 
+0

searchlogic在Rails 3中并不能很好地工作,并且在一段时间内没有被维护或更新。 – 2011-01-05 13:20:18

0

您应该能够通过连接表,分组只能得到每一个模型结果和订购回来你想要的为了做到这一点在一个单一的查询。下面列出的是沿着你所需要的线路:

Product.joins(:model => :brand).group("models.name").order("products.price, brands.name, models.name") 

我已经猜到你的品牌的塑造和表有一栏叫名字或东西是什么型号名称和品牌名称存储在