Object.update_attribute(:only_one_field, "Some Value")
Object.update_attributes(:field1 => "value", :field2 => "value2", :field3 => "value3")
Both of these will update an object without having to explicitly tell AR to update.
Rails API says:
for 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.
for update_attributes
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.
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?
My question is does update_attribute also bypass the before save or just the validation.
Also, what is the correct syntax to pass a hash to update_attributes... check out my example at the top.
To answer your question, update_attribute skips pre save "validations" but it still runs any other callbacks like
after_save
etc. So if you really want to "just update the column and skip any AR cruft" then you need to use (apparently)Model.update_all(...)
see https://stackoverflow.com/a/7243777/32453Also worth noting is that with
update_attribute
, the desired attribute to be updated doesn't need to be white listed withattr_accessible
to update it as opposed to the mass assignment methodupdate_attributes
which will only updateattr_accessible
specified attributes.Great answers. notice that as for ruby 1.9 and above you could (and i think should) use the new hash syntax for update_attributes:
You might be interested in visiting this blog post concerning all the possible ways to assign an attribute or update record (updated to Rails 4)
update_attribute, update, update_column, update_columns etc.
http://www.davidverhasselt.com/set-attributes-in-activerecord/. For example it differs in aspects such as running validations, touching object's updated_at or triggering callbacks.As an answer to the OP's question
update_attribute
does not by pass callbacks.update_attribute
simply updates only one attribute of a model, but we can pass multiple attributes inupdate_attributes
method.Example:
It pass the validation
it doesn't update if validation fails.
Tip:
update_attribute
is being deprecated in Rails 4 via Commit a7f4b0a1. It removesupdate_attribute
in favor ofupdate_column
.