【问题标题】:Update a ruby array containing objects更新包含对象的 ruby​​ 数组
【发布时间】:2019-12-25 01:30:05
【问题描述】:

如果我在 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"}>]

任何帮助将不胜感激。

【问题讨论】:

    标签: ruby-on-rails ruby


    【解决方案1】:

    您必须使用each,因为map 返回一个已更改的数组。 each 正在迭代数组。

    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 会更好。

    【讨论】:

    • 这将更新内存中的对象,但不保存它。您需要使用类似 test_arr.map{&:save}
    • map 不会改变数组,它会创建一个新数组。
    • 你说得对,我的第一个地图定义是错误的。后面的详细描述使mapmap!有所不同
    【解决方案2】:

    如果你想立即保存,试试这个:

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

    如果您需要比这更高的性能,您可以尝试 update_all,并将对象数组中的 ID 传递给它。 http://apidock.com/rails/ActiveRecord/Relation/update_all

    【讨论】:

      【解决方案3】:

      实际上,您的代码应该会成功更新属性。但我认为你混淆了mapeach 方法。

      map 方法遍历整个数组并收集每次迭代的结果,这就是为什么它的第二个别名是 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"}>]
      

      【讨论】:

        【解决方案4】:

        map 遍历数组并为您提供一个包含块结果的新数组。

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

        使用map! 更新数组。

        【讨论】:

        • 这将更新内存中的对象,但不保存它。您需要使用类似 test_arr.map{&:save}
        猜你喜欢
        • 2019-08-05
        • 1970-01-01
        • 2017-11-15
        • 1970-01-01
        • 2022-06-18
        • 1970-01-01
        • 2020-11-15
        • 1970-01-01
        相关资源
        最近更新 更多