over 1 year ago

Cheat Sheet

Rails 4

Method Uses Default Accessor Saved to Database Validations Callbacks Touches updated_at
update_attribute Yes Yes No Yes Yes
update_attributes Yes Yes Yes Yes Yes
update Yes Yes Yes Yes Yes
update_column No Yes No No No
update_columns No Yes No No No
User::update Yes Yes Yes Yes Yes
User::update_all No Yes No No No
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

← 你應該認真寫的那一份履歷 - 面試所要掌握的小技巧(3) Linux 基本指令 →
 
comments powered by Disqus