Hisakeyのブログ

エンジニアが色々呟くブログです。

saveメソッドとupdateメソッドの何が違うの?

Railsの開発でよく使う saveupdate

どちらも「レコードを保存する」ためのメソッドですが、どのように実装されていて、どんな違いがあるのか?を意識してませんでした。

ActiveRecordソースコードを参考に saveupdate の内部処理を比較し、何が違うのかを記事にしてみました。


どのように使うのか?

実際は、下記のような形でよく使われます。

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 を使い分けています。

api.rubyonrails.org

github

一方のupdate の処理フロー

update は属性の更新と保存をまとめて行う便利メソッドです。

def update(attributes)
  assign_attributes(attributes)
  save
end

api.rubyonrails.org

update は内部的に assign_attributes → save の順で処理されているだけです。

結論

save は「現在の属性の状態を保存する」メソッド。

update は「属性を変更して、その変更後の状態を保存する」メソッド。

update はあくまで assign_attributes + save のシンプルなメソッド。

つまり、「すでに変更された状態を保存したい」なら save を、「属性も一緒に変更して保存したい」なら update を使うという使い分けができそうです。

まとめ

Railsを使っているとなんとなく使っていた save と update。 その裏側の実装を知ることで、どのようなロジックがなのか知ることができました!