Product
具有以下属性:
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 :(得分:1)
您应该能够通过连接表在单个查询中执行此操作,分组为每个模型只获得一个结果,并按照您想要的顺序返回。以下内容应与您的需求一致:
Product.joins(:model => :brand).group("models.name").order("products.price, brands.name, models.name")
我猜测你的模型和品牌表有一个名为name的列,或者是存储模型名称和品牌名称的内容。
答案 1 :(得分: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
您最好重构上面的代码,以便每个函数只有一个责任。
答案 2 :(得分:0)
使用searchlogic gem。它产生了很多搜索和排序的范围。例如
Product.search(:order => :ascend_by_model)