更新包含对象的ruby数组

Ric*_*hip 2 ruby ruby-on-rails

如果我在ruby中有一个对象数组,我如何迭代数组并更新对象?

示例:test_arr具有以下值:(由find_by_sql提取)

[#<SimpleClass:0xb74c8968 @attributes={"id"=>1024, "value"=>"9999"}>, #<SimpleClass:0xb74c8940 @attributes={"id"=>1025, "value"=>"9999"}>]

test_arr.map{|r| r.value="1111"}
Run Code Online (Sandbox Code Playgroud)

返回["1111","1111"]

我需要类似的东西:(更新后)

[#<SimpleClass:0xb74c8968 @attributes={"id"=>1024, "value"=>"1111"}>, #<SimpleClass:0xb74c8940 @attributes={"id"=>1025, "value"=>"1111"}>]
Run Code Online (Sandbox Code Playgroud)

任何帮助将不胜感激.

knu*_*nut 6

你必须使用 each

map正在返回一个更改的数组.each正在迭代数组.

test_arr.each{|r| r.value="1111"}
Run Code Online (Sandbox Code Playgroud)

test_arr.map{|r| r.value="1111"}
Run Code Online (Sandbox Code Playgroud)

如果返回更改的数组,则内容是块的结果(在示例中为"1111").随着map!阵列被修改.

您也可以使用:

test_arr.map{|r| 
  r.value="1111"   # modify r
  r                # return r - you are replacing r with r
}
Run Code Online (Sandbox Code Playgroud)

但正如已经提到的:each会更好.

  • 这将更新内存中的对象,但不保存它.您将需要使用类似test_arr.map {&:save}的内容来关注它 (2认同)