根据与数组匹配的键对哈希进行排序

时间:2014-04-07 03:23:53

标签: ruby-on-rails ruby ruby-on-rails-4

我有一个rails 4应用程序。我有以下代码:

@product_types = StoreProduct.where(:store_id => @store.id).pluck(:name)

@product_data = @products.map do |product|
    product[ :data ].values.reverse!
end

@product_types输出如下所示:["Color", "QTY", "TypeOf"]

@product_data输出如下所示:[["RED", "17", "BOOK"]]

@products看起来像:[#<Product id: 141, store_id: 146, data: {"Color"=>"RED", "QTY"=>"17", "TypeOf" => "BOOK"}>]

我希望@product_data的排序顺序与@product_types相同。因此,如果它的QTY,Color,TypeOf为@product_types,则@product_data应按其密钥排序,方式与@product_types相同,因此@product_data应为:17,RED,BOOK。

2 个答案:

答案 0 :(得分:2)

而不是:

@product_data = @products.map do |product|
  product[:data].values.reverse!
end

尝试:

@product_data = @products.map do |product|
  @product_types.map { |pt| product[:data][pt] }
end

#=> [["RED", "17", "BOOK"]]

答案 1 :(得分:1)

这可能会有所帮助。我直接处理一般的Ruby构造,模仿你的@products

foo = ["Color", "QTY", "TypeOf"]
bar = [{'QTY' => 17, 'TypeOf' => 'Book', 'Color' => 'Red'},
       {'Color' => 'Blue', 'QTY' => 18, 'TypeOf' => 'Gem'}]
p foo.map{ |x| bar.map { |y| y[x] } }.transpose 
#=> [["Red", 17, "Book"], ["Blue", 18, "Gem"]]

Running code.