Nic Lin's Blog

喜歡在地上打滾的 Rails Developer

關於 update method 的不同之處

Cheat Sheet

Rails 4

MethodUses Default AccessorSaved to DatabaseValidationsCallbacksTouches updated_at
update_attributeYesYesNoYesYes
update_attributesYesYesYesYesYes
updateYesYesYesYesYes
update_columnNoYesNoNoNo
update_columnsNoYesNoNoNo
User::updateYesYesYesYesYes
User::update_allNoYesNoNoNo

update(id, attributes) public

以 Rails 最正規的用法來說,會觸發 validation 、 callback 、 也會同時更新欄位中的 updated_at

update_columns(attributes) public

相當於直接下 SQL 更新,會直接忽略 ActiveRecord 的 validation,也不會進行回呼 Callback,甚至該欄位的 updated_at 時間戳記也不會更新,只會單一更新你傳送進來的 Attribute。

update_column(name, value) public

如同 update_column,只是用法變成 update_columns(name => value)

update_attributes(attributes) public

會接收傳進來的 Hash 並且 save,如果 object 無效或是被 validation 擋下的話會回傳 false

Example:

Object.update_attribute(:only_one_field, "Some Value")
Object.update_attributes(:field1 => "value", :field2 => "value2", :field3 => "value3")
Object.update_attributes(params[:user])

update_attribute(name, value) public

與 update_attributes 不同的是(雖然只差一個s),是不會做 validation ,為了避免在對整個 model 不熟的情況下,不建議直接做 pass validation ,很有可能導致災難讓自己花上更多時間 Debug。

題外話

原本在 Rails 4 約2012年時期,將 update_attributes 取代 update_column 了,都已經 merged 到 master (參考 Rails4 Commit a7f4b0a1),結果後來在這個 issue,是有人不贊成這兩個 method 是可以直接等價交換的,因為 update_attributeupdate_attributes 之間最大的差異就是在於 validation 驗證,並且 update_attribute 是在 ActiveRecord 底下保有完整的 dirty tracking and callbacks,也因為 update_column 並沒有這項特性,所以被要求 re-added 了 XD

comments powered by Disqus