Rails:如何过滤和分类产品?

时间:2011-01-05 12:55:56

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

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

我怎么能这样做?

3 个答案:

答案 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)