3

rubyにオブジェクトの配列がある場合、配列を反復処理してオブジェクトを更新するにはどうすればよいですか?

例: test_arr次の値があります:( find_by_sqlによってフェッチされます)

test_arr = [
  {"id"=>1024, "value"=>"9999"},
  {"id"=>1025, "value"=>"9999"} 
]
test_arr.map{|r| r.value="1111"}

["1111"、"1111"]を返します

次のようなものが必要です:(更新後)

[{"id"=>1024, "value"=>"1111"}>,
{"id"=>1025, "value"=>"1111"}>]

どんな助けでも大歓迎です。

4

4 に答える 4

9

は変更された配列を返すeachため、を使用する必要があります。配列を繰り返しています。mapeach

test_arr.each{|r| r.value="1111"}

test_arr.map{|r| r.value="1111"}

変更された配列を返します。コンテンツはブロックの結果です(例では「1111」です)。map!アレイで変更されます。

次のものも使用できます。

test_arr.map{|r| 
  r.value="1111"   # modify r
  r                # return r - you are replacing r with r
}

しかし、すでに述べたように:eachより良いでしょう。

于 2012-09-15T18:38:43.440 に答える
3

すぐに保存したい場合は、次のことを試してください。

test_arr.map{ |r| r.update_attributes( { :value => "1111" } ) }

これ以上のパフォーマンスが必要な場合は、update_allを試して、オブジェクトの配列からIDを渡すことができます。http://apidock.com/rails/ActiveRecord/Relation/update_all

于 2012-09-15T18:43:16.270 に答える
2

実際、コードは属性を正常に更新する必要があります。しかし、私はあなたがmapeach方法を混乱させたと思います。

このmapメソッドは配列全体を反復処理し、すべての反復から結果を収集します。そのため、2番目のエイリアス名はcollectです。

必要なのはeachメソッドです。これは配列を反復処理し、ブロックで説明されているアクションを実行します。

したがって、コードは次のようになります。

test_arr.each { |r| r.value="1111" }
test_arr.inspect 
#=> [#<SimpleClass:0xb74c8968 @attributes={"id"=>1024, "value"=>"1111"}>, #<SimpleClass:0xb74c8940 @attributes={"id"=>1025, "value"=>"1111"}>]
于 2012-09-15T18:53:41.210 に答える
1

mapは配列を反復処理し、ブロックの結果を含む新しい配列を提供します。

test_arr = test_arr.map { |val|
   val.attr - new_value
   val # last line of the block is the return value
}

map!アレイを所定の位置に更新するために使用します。

于 2012-09-15T18:38:01.007 に答える