3

配列のサンプルを次に示します。

{"C1"=>[
        {:upc=>"51857195821952", :product_id=>"1234", :name=>"name", :price=>" $15 ", :color=>"green", :size=>"L", :description=>"descr"},
        {:upc=>"352353wegs", :product_id=>"456", :name=>"name2", :price=>"$21", :color=>"black", :size=>"S", :description=>"descr"}, # ...
       ],
 #...
}

そして、ここでその配列からデータを取得しようとしています:

@array.each do |p|
  product = Product.new
  product.sku = p[0]
  product.name = p[1][0][:name] #can't convert Symbol into Integer
  price = p[1].select{ |pr| !pr[:price].nil? and pr[:price] != "0" }.min_by{ |i| i[:price].to_f }[:price]
  product.price = "%.2f" % (price.to_f)
  ...
end

配列からデータをフェッチしようとするたびにproduct.name =、エラーcan't convert Symbol to Integerという行に出ます。

この場合、何が問題なのですか? この問題に午後の一部を費やしましたが、残念ながらまだ理解できません...

ありがとう

4

3 に答える 3

5

あなた@arrayは実際にはハッシュです。次のようにフォーマットされます。

{ 
  'name1' => [{:upc => "..."},{:upc => "..."}],
  'name2' => [{:upc => "..."},{:upc => "..."}],
  #...
}

eachこれはハッシュであるため、 (同様に機能する) メソッドで 2 つの引数を使用できますmap(1 つはキー用、もう 1 つは値用)。

@array.each do |name, array|
  product = Product.new
  product.sku = name # returns "C1"
  array.each do |data|
    data[:upc]
    data[:name]
    #etc...
  end
end
于 2013-02-27T21:26:15.270 に答える
0

根本的な問題は、上で示したサンプル配列が実際には配列ではないことです。キーと値のペアを持つハッシュです。したがって、ハッシュにはlike 配列がないため、コード like p[0]orは意味がありません。ハッシュは順序付けされていません。ハッシュ値は、配列のような「インデックス」ではなく「キー」でアクセスされます。p[1][0]index

ハッシュのキーと値のペアを反復処理すると、次のようになります。

1.9.3p194 :001 > x = {:x => 10, :y => 9, :z => 10}
 => {:x=>10, :y=>9, :z=>10} 
1.9.3p194 :002 > x.each do |key, value|
1.9.3p194 :003 >   puts "#{key} : #{value}"
1.9.3p194 :004?> end 
x : 10
y : 9
z : 10
 => {:x=>10, :y=>9, :z=>10} 
于 2013-02-27T21:30:00.013 に答える
0

配列とハッシュを少し混同しているようです。

これを考えると:

@array = {"C1"=>[
  {:upc=>"51857195821952", :product_id=>"1234", :name=>"name", :price=>" $15 ", :color=>"green", :size=>"L", :description=>"descr"}, 
  {:upc=>"352353wegs", :product_id=>"456", :name=>"name2", :price=>" $21 ", :color=>"black", :size=>"S", :description=>"descr"} 
] }

それから@array.class.nameですHash

次のようにアクセスして、実際の配列を取得できます。

@actual_array = @array["C1"]

すると@actual_array.class.nameArray

したがって、このアプローチを取り、次のように書き直します。

@array = {"C1"=>[
  {:upc=>"51857195821952", :product_id=>"1234", :name=>"name", :price=>" $15 ", :color=>"green", :size=>"L", :description=>"descr"}, 
  {:upc=>"352353wegs", :product_id=>"456", :name=>"name2", :price=>" $21 ", :color=>"black", :size=>"S", :description=>"descr"} 
 ] }

@actual_array = @array["C1"]

@actual_array.each do |p|
  puts p[:name]
end

これを行うと、:name要素の値がきれいに出力されることがわかります。

于 2013-02-27T21:33:23.417 に答える