Rails:#update_attribute与#update_attributes [英] Rails: #update_attribute vs #update_attributes
问题描述
obj.update_attribute(:only_one_field, 'Some Value')
obj.update_attributes(field1: 'value', field2: 'value2', field3: 'value3')
这两种方法都将更新对象,而不必明确告诉ActiveRecord更新.
Both of these will update an object without having to explicitly tell ActiveRecord to update.
Rails API说:
Rails API says:
update_attribute
update_attribute
更新单个属性并保存记录,而无需执行正常的验证过程.这对于现有记录上的布尔标志特别有用.混入验证模块时,Base中的常规update_attribute方法被替换为默认方法.
Updates a single attribute and saves the record without going through the normal validation procedure. This is especially useful for boolean flags on existing records. The regular update_attribute method in Base is replaced with this when the validations module is mixed in, which it is by default.
update_attributes
update_attributes
更新传入的哈希中的所有属性并保存记录.如果对象无效,则保存将失败并返回false.
Updates all the attributes from the passed-in Hash and saves the record. If the object is invalid, the saving will fail and false will be returned.
因此,如果我不想验证对象,则应使用 #update_attribute
.如果我在 #before_save
上进行了更新,会堆栈溢出吗?
So if I don't want to have the object validated I should use #update_attribute
. What if I have this update on a #before_save
, will it stackoverflow?
我的问题是 #update_attribute
是否也绕过了保存之前或只是进行了验证.
My question is does #update_attribute
also bypass the before save or just the validation.
此外,将哈希传递给 #update_attributes
的正确语法是什么……请在顶部查看我的示例.
Also, what is the correct syntax to pass a hash to #update_attributes
... check out my example at the top.
推荐答案
请参考 update_attribute
.单击显示源后,您将获得以下代码
Please refer to update_attribute
. On clicking show source you will get following code
# 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
和看看你得到的代码
and now refer update_attributes
and look at its code you get
# 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(true)
.
the difference between two is update_attribute
uses save(false)
whereas update_attributes
uses save
or you can say save(true)
.
很抱歉,我的发言很重要,但我想说的很重要.如果
为假,它将绕过所有验证与保存(perform_validation = true)
> perform_validation save
相关.
Sorry for the long description but what I want to say is important. save(perform_validation = true)
, if perform_validation
is false it bypasses (skips will be the proper word) all the validations associated with save
.
第二个问题
此外,将哈希传递给update_attributes的正确语法是什么?请在顶部查看我的示例.
Also, what is the correct syntax to pass a hash to update_attributes... check out my example at the top.
您的示例是正确的.
Object.update_attributes(:field1 => "value", :field2 => "value2", :field3 => "value3")
或
Object.update_attributes :field1 => "value", :field2 => "value2", :field3 => "value3"
,或者如果您获取所有字段数据&哈希名称说 params [:user]
在这里仅使用
or if you get all fields data & name in a hash say params[:user]
here use just
Object.update_attributes(params[:user])
这篇关于Rails:#update_attribute与#update_attributes的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!