根据条件对对象进行排序

时间:2013-08-16 13:23:04

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

 @products =  [#<Product id: 15, name: "abcd", revision: 100>,
              #<Product id: 19, name: "test", revision: 1080>,
              #<Product id: 5, name: "abcd", revision: 109>,
              #<Product id: 450, name: "test", revision: 9>,
              #<Product id: 2, name: "example", revision: 150>]

问题:我想输出所有产品,但唯一的条件是,如果名称重复多次,那么我想输出具有最新版本的产品。

预期输出:

@products =  [#<Product id: 19, name: "test", revision: 1080>,
              #<Product id: 5, name: "abcd", revision: 109>,
              #<Product id: 2, name: "example", revision: 150>]

由于有两个名为“abcd”的产品,它应该显示具有最新版本的产品,并且应用于“test”,但由于“示例”没有重复,因此它会正常呈现。

任何帮助都会非常感激,一直坚持这一点。

2 个答案:

答案 0 :(得分:3)

这应该可以解决问题:

temp_array = @products.group_by(&:name)

@filtered_products = temp_array.map do |name, products|
  products.sort{ |p1, p2| p2.revision <=> p1.revision }.first
end

如果您需要,请随时询问详细信息;)

答案 1 :(得分:0)

仅限ActiveRecord:

Product.select("name, MAX(revision) AS max_revision, COUNT(*) AS count")
       .group("name")
       .having("count > 1")