代码之家  ›  专栏  ›  技术社区  ›  Sam å±±

rails:update_attributes与update_attributes

  •  241
  • Sam å±±  · 技术社区  · 14 年前
    Object.update_attribute(:only_one_field, "Some Value")
    Object.update_attributes(:field1 => "value", :field2 => "value2", :field3 => "value3")
    

    这两个都将更新一个对象,而不必显式地告诉ar进行更新。

    rails api说:

    用于更新属性

    更新单个属性并保存记录,而无需执行常规验证过程。这对于现有记录上的布尔标志尤其有用。当validations模块混入时,base中的常规update_attribute方法将替换为该方法,这在默认情况下是这样的。

    用于更新属性

    从传入的哈希更新所有属性并保存记录。如果对象无效,则保存将失败,并返回false。

    所以如果我不想验证对象,我应该使用update_属性。如果在保存前有此更新,它会堆栈溢出吗?

    我的问题是update_属性是否也会绕过before save或只是验证。

    另外,传递散列以更新属性的正确语法是什么…看看我上面的例子。

    11 回复  |  直到 7 年前
        1
  •  315
  •   Andre Figueiredo    7 年前

    请参考 update_attribute . 单击ShowSource,您将得到以下代码

          # File vendor/rails/activerecord/lib/active_record/base.rb, line 2614
    2614:       def update_attribute(name, value)
    2615:         send(name.to_s + '=', value)
    2616:         save(false)
    2617:       end
    

    现在请参考 update_attributes 看看你得到的代码

          # File vendor/rails/activerecord/lib/active_record/base.rb, line 2621
    2621:       def update_attributes(attributes)
    2622:         self.attributes = attributes
    2623:         save
    2624:       end
    

    两者的区别在于 更新属性 使用 save(false) 反之 更新属性 使用 save 或者你可以说 save(true) .

    很抱歉描述太长,但我想说的很重要。 save(perform_validation = true) 如果 perform_validation 如果是错误的,它将绕过(跳过将是正确的词)所有 validations 节约 .

    第二个问题

    另外,传递散列以更新属性的正确语法是什么…看看我上面的例子。

    你的例子是正确的。

    Object.update_attributes(:field1 => "value", :field2 => "value2", :field3 => "value3")
    

    Object.update_attributes :field1 => "value", :field2 => "value2", :field3 => "value3"
    

    或者,如果在哈希表中获取所有字段数据和名称,请说 params[:user] 在这里使用

    Object.update_attributes(params[:user])
    
        2
  •  74
  •   Matt    12 年前

    提示: update_attribute 在rails 4中通过 Commit a7f4b0a1 . 它移除 更新属性 赞成 update_column .

        3
  •  15
  •   BoltClock    10 年前

    更新属性

    此方法更新对象的单个属性,而不调用基于模型的验证。

    obj = Model.find_by_id(params[:id])
    obj.update_attribute :language, “java”
    

    更新属性

    此方法更新单个对象的多个属性,并通过基于模型的验证。

    attributes = {:name => “BalaChandar”, :age => 23}
    obj = Model.find_by_id(params[:id])
    obj.update_attributes(attributes)
    

    希望这个答案能明确什么时候使用什么样的主动记录方法。

        4
  •  11
  •   Kibet Yegon    12 年前

    同样值得注意的是 update_attribute ,需要更新的属性不需要用 attr_accessible 相对于质量分配方法更新 update_attributes 只会更新 无障碍 指定的属性。

        5
  •  6
  •   Ziv Galili    10 年前

    很好的答案。 注意,对于Ruby1.9及以上版本,您可以(我认为应该)使用新的哈希语法来更新属性:

    Model.update_attributes(column1: "data", column2: "data")
    
        6
  •  5
  •   adamliesko    9 年前

    您可能有兴趣访问这篇关于分配属性或更新记录(更新到rails 4)的所有可能方法的博客文章。 update_attribute, update, update_column, update_columns etc. http://www.davidverhasselt.com/set-attributes-in-activerecord/ . 例如,它在运行验证、触摸对象的更新位置或触发回调等方面有所不同。

    作为对操作人员问题的回答 update_attribute 不通过传递回调。

        7
  •  5
  •   Arslan Ali    8 年前

    update_attribute 只需更新一个模型的一个属性,但是我们可以在 update_attributes 方法。

    例子:

    user = User.last
    
    #update_attribute
    user.update_attribute(:status, "active")
    

    通过验证

    #update_attributes
    user.update_attributes(first_name: 'update name', status: "active")
    

    如果验证失败,它不会更新。

        8
  •  3
  •   AkaZecik MikeZ    8 年前

    update_attribute update_attributes 是相似的,但是 有一个很大的区别: 更新属性 运行验证。

    也:

    • 更新属性 用于更新记录 单一的 属性。

      Model.update_attribute(:column_name, column_value1)
      
    • 更新属性 用于更新记录 倍数 属性。

      Model.update_attributes(:column_name1 => column_value1, :column_name2 => column_value2, ...)
      

    鉴于这两种方法的名称和工作原理相似,它们很容易混淆。因此, 更新属性 是为了 update_column .

    现在,在 铁路4号 你可以使用 Model.update_column(:column_name, column_value) 在某地 Model.update_attribute(:column_name, column_value)

    Click here 获取更多信息 更新列 .

        9
  •  2
  •   Community chadoh    7 年前

    要回答您的问题,update_attribute会跳过预保存“验证”,但是 仍然运行 任何其他类似的回调 after_save 所以如果你真的想“更新列并跳过任何ar cruft”,那么你需要使用(显然)

    Model.update_all(...) 看见 https://stackoverflow.com/a/7243777/32453

        10
  •  2
  •   Wojciech Bednarski    9 年前

    最近我遇到 update_attribute VS update_attributes 和验证问题,如此相似的名字,如此不同的行为,如此混乱。

    以便将哈希传递给 更新属性 并绕过验证,您可以执行以下操作:

    object = Object.new
    object.attributes = {
      field1: 'value',
      field2: 'value2',
      field3: 'value3'
    }
    object.save!(validate: false)
    
        11
  •  1
  •   concept47    14 年前

    我想你的问题是在before_save中有update_属性是否会导致无休止的循环(在before_save回调中有update_属性调用,最初由update_属性调用触发)

    我很确定它确实绕过了before-save回调,因为它实际上并没有保存记录。您还可以使用

    model.save错误