首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rails:#update_attribute与#update_attributes

Rails:#update_attribute与#update_attributes
EN

Stack Overflow用户
提问于 2010-05-06 04:49:38
回答 11查看 321.9K关注 0票数 268
代码语言:javascript
复制
obj.update_attribute(:only_one_field, 'Some Value')
obj.update_attributes(field1: 'value', field2: 'value2', field3: 'value3')

这两种方法都将更新一个对象,而不必显式地告诉ActiveRecord更新。

Rails API说:

update_attribute 更新单个属性并保存记录,而无需经过正常的验证过程。这对于现有记录上的布尔标志特别有用。当验证模块混合(默认情况下是这样)时,Base中的常规update_attribute方法将被替换为此方法。update_attributes 更新传入哈希的所有属性并保存记录。如果对象无效,则保存将失败,并返回false。

因此,如果我不想对对象进行验证,我应该使用#update_attribute。如果我在#before_save上有这个更新,它会发生堆栈溢出吗?

我的问题是,#update_attribute是否也绕过了以前的保存或只是验证。

另外,将散列传递给#update_attributes的正确语法是什么.看看我在上面的例子。

EN

回答 11

Stack Overflow用户

回答已采纳

发布于 2010-05-06 05:32:09

请参考update_attribute。单击“显示源”,您将得到以下代码

代码语言:javascript
复制
      # 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并查看它的代码

代码语言:javascript
复制
      # File vendor/rails/activerecord/lib/active_record/base.rb, line 2621
2621:       def update_attributes(attributes)
2622:         self.attributes = attributes
2623:         save
2624:       end

两者的区别是update_attribute使用save(false),而update_attributes使用save,或者可以说是save(true)

很抱歉描述得太长了,但我想说的很重要。save(perform_validation = true),如果perform_validation是假的,它会绕过(跳过将是正确的词)与save相关的所有验证

关于第二个问题

另外,将散列传递给update_attributes的正确语法是什么.看看我在上面的例子。

你的例子是正确的。

代码语言:javascript
复制
Object.update_attributes(:field1 => "value", :field2 => "value2", :field3 => "value3")

代码语言:javascript
复制
Object.update_attributes :field1 => "value", :field2 => "value2", :field3 => "value3"

或者,如果您在散列中获得所有字段数据&名称,比如这里的params[:user],只使用

代码语言:javascript
复制
Object.update_attributes(params[:user])
票数 348
EN

Stack Overflow用户

发布于 2012-06-27 13:11:14

提示:在Rails 4中,update_attribute是通过提交a7f4b0a1被废弃的。它移除update_attribute以支持update_column

票数 75
EN

Stack Overflow用户

发布于 2013-01-21 10:42:46

update_attribute

该方法在不调用模型验证的情况下更新对象的单个属性。

代码语言:javascript
复制
obj = Model.find_by_id(params[:id])
obj.update_attribute :language, “java”

update_attributes

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

代码语言:javascript
复制
attributes = {:name => “BalaChandar”, :age => 23}
obj = Model.find_by_id(params[:id])
obj.update_attributes(attributes)

希望这个答案能澄清什么时候使用什么方法的活动记录。

票数 18
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2778522

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档