2016-07-27 13 views
0

私はこのループがあります。Ruby - ハッシュキーに配列を追加する方法は?

car_data = Hash.new 
Car.all.each do |c| 
    car_data[c.brand] = c.id 
    car_data['NEW'] << c.id if c.new == 1 
end 

を私はこのsnipperを持っており、car_data['NEW']に、すべての新車を保存しようとしますが、このコードは(8あるはずです)ハッシュに一つだけのアイテムを保持します。

Iは、アレイとしてcar_data['NEW']ように定義しようとした:

car_data = Hash.new 
car_data['NEW'] = Hash.new 
Car.all.each do |c| 
    car_data[c.brand] = c.id 
    car_data['NEW'] << c.id if c.new == 1 
end 

をしかし、結果は同じであった - ただ一つの項目。 配列全体をハッシュキー要素に保存するにはどうすればよいですか?

ありがとうございます。

+1

Rubyの規則が使用する '{}'新しいハッシュのために、その呼び出し '' Hash.newなどのデフォルト値を供給する場合Hash.new'のみ必要である(0) '。少ないほうがいいですね。 – tadman

答えて

2

car_data['NEW']Arrayとして宣言する必要があります。あなたはまた、単一のステップ率直

car_data = { new: [] } 
Car.all.each do |c| 
    car_data[c.brand] = c.id 
    car_data[:new] << c.id if c.new == 1 
end 

でそれを行うことができます

car_data = Hash.new 
car_data['NEW'] = [] 
Car.all.each do |c| 
    car_data[c.brand] = c.id 
    car_data['NEW'] << c.id if c.new == 1 
end 

、そのようにハッシュを使用することが私には少し奇妙に思えます。特に、Hashの異なる種類の情報を混在させることは、他の非オブジェクト指向言語から継承された非常に悪いアプローチです。

少なくとも2つの別々の変数を使用します。しかし、私は意味のある例を提供するために文脈について十分に知りません。

3

あなたは配列としてcar_data['NEW']あなたは(初期化)を定義しようとしたことを書いたが、何をされています...ハッシュとして、それを初期化しました。

変更:

car_data['NEW'] = Hash.new 

へ:

car_data['NEW'] = [] 

完全なコードは次のようになります。

car_data = Hash.new 
car_data['NEW'] = [] 
Car.all.each do |c| 
    car_data[c.brand] = c.id 
    car_data['NEW'] << c.id if c.new == 1 
end 
+1

より良い: 'car_data = {'NEW' => []}'。それをワンショットでやりなさい。 – tadman

1
car_data = Car.all.each_with_object(Hash.new { |h, k| h[k] = [] }) do |c, memo| 
    memo[c.brand] = c.id 
    memo['NEW'] << c.id if c.new == 1 
end 

や、シンプルな、必要に応じてのその場でそれを作成してみましょう:

car_data = Car.all.each_with_object({}) do |c, memo| 
    memo[c.brand] = c.id 
    (memo['NEW'] ||= []) << c.id if c.new == 1 
end 

NEWキーがどのような場合には、既存する場合は、以下の@tadmanでコメントを参照してください。

+0

おそらく '{'NEW' => []}'は、オプションでそれを初期化するクラフトよりも優れています。 – tadman

+0

@tadmanこのクラフトには、「たぶんnil」オブジェクトに対処するヒントが含まれています。洗練された初期化のために、常に変種1が存在する。 – mudasobwa

+0

私はあなたが言っていることを知っていますが、ここでの違いは、デフォルトでは無害なもののように思える「NEW」キーを初期化していない可能性があります。 – tadman

関連する問題