1
 @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」という名前の製品が 2 つあったため、最新のリビジョンのものと「test」に同じものが表示されるはずですが、「example」には重複がなかったため、正常にレンダリングされます。

どんな助けでも本当にありがたいです、これにこだわっています。

4

2 に答える 2

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

必要に応じて詳細を尋ねることを躊躇しないでください;)

于 2013-08-16T13:33:59.423 に答える
0

ActiveRecord のみ:

Product.select("name, MAX(revision) AS max_revision, COUNT(*) AS count")
       .group("name")
       .having("count > 1")
于 2013-08-16T13:41:17.300 に答える