Railsの開発でよく使う save
と update
。
どちらも「レコードを保存する」ためのメソッドですが、どのように実装されていて、どんな違いがあるのか?を意識してませんでした。
ActiveRecordのソースコードを参考に save
と update
の内部処理を比較し、何が違うのかを記事にしてみました。
どのように使うのか?
実際は、下記のような形でよく使われます。
user = User.new(name: "Alice") user.save # => true or false user.update(name: "Bob") # => true or false
ActiveRecordの内部実装を見てみると、
def save(**options) create_or_update(**options) end この create_or_update は新規かどうかで処理を分岐します def create_or_update(**options) _raise_readonly_record_error if readonly? result = new_record? ? _create_record(**options) : _update_record(**options) ... end
つまり、**レコードの状態が new_record? かどうかで INSERT と UPDATE を使い分けています。
一方のupdate の処理フロー
update は属性の更新と保存をまとめて行う便利メソッドです。
def update(attributes) assign_attributes(attributes) save end
update は内部的に assign_attributes → save の順で処理されているだけです。
結論
save は「現在の属性の状態を保存する」メソッド。
update は「属性を変更して、その変更後の状態を保存する」メソッド。
update はあくまで assign_attributes + save のシンプルなメソッド。
つまり、「すでに変更された状態を保存したい」なら save を、「属性も一緒に変更して保存したい」なら update を使うという使い分けができそうです。
まとめ
Railsを使っているとなんとなく使っていた save と update。 その裏側の実装を知ることで、どのようなロジックがなのか知ることができました!