Ruby on Rails

【初心者向け】RailsのUpdate系メソッドの使い方まとめ

どうも、Kohei(@koheinishino_)です。

RailsのUpdate系メソッドって何個か種類あるけど、それぞれどういう違いだったっけ?

というRails開発者の方のために、この記事ではよく話題にあがることの多い4つのUpdate系のメソッドの違いについてまとめてみました。

先にお伝えしておくと「安全面から基本的にはupdateメソッドを使用すべき」です。

しかし過去の自分と同じように、開発上やむをえずに他のUpdate系メソッドで対応したいと考えている方は是非参考にしてみてください!

RailsのUpdate系メソッド一覧

先にそれぞれのメソッドの主な違いを一覧で記載しておきます。

さらっと確認したい方は以下の表をご参照ください。

メソッド名バリデーションの有無備考
update単体モデル、複数条件を指定できる。
update_all×複数モデル、複数条件を指定できる。
update_attributes非推奨メソッド。
update_attribute×単体モデル、単体条件を指定できる。

Railsの各Update系メソッドの使い方

update

一番オーソドックスなモデルの更新方法がupdateメソッドかと思います。

更新するモデルを単体で指定する必要がありますが、更新する属性は複数指定できます。

モデルのバリデーションとコールバックが適用されるため、安全にモデルを更新したい場合に使用します。

更新に成功した場合はtrue、失敗した場合はfalseが戻り値として返却されます。

user = User.find(1)
user.update(name: 'Messi')
# => true

また「!」をつけて破壊的メソッドとすると、updateしたレコードが無効な場合にfalseを返すのではなく、例外が発生します。

user = User.find(1)
user.update!(name: nil)
# => ActiveRecord::StatementInvalid: Validation failed: Name can't be blank

update_all

複数のモデルを更新したい場合はupdate_allメソッドを使用して更新します。また、複数の属性を指定して更新が可能です。

ただし、update_allメソッドではバリデーションとコールバックが実行されません。そのため、必要であれば更新前にvalid?メソッドで検証したり、コールバックの処理が適用されるようにしましょう。

また、updated_atも更新されないため、更新する必要がある場合は属性で指定しておきましょう。

そのため、やむを得ず無理やりデータを書き換える際に使われることが多く、使用する際には他に影響箇所がないか確認して慎重に使用するようにしましょう。

戻り値としては更新されたレコード数が返却されます。

User.all.update_all(team: 'Barcelona')
# => 11

update_attribute

update_attributeメソッドはupdateメソッドと似ているかと思いきや、実態はけっこう異なるため取り扱い注意なメソッドです。

まず更新するモデルも更新する属性も単体で指定する必要があります。

そしてupdateメソッドは属性をハッシュ形式で指定するのに対し、update_attributeメソッドは属性をシンボルで指定し、更新する値をカンマで区切って指定します。

update_attributeメソッドはバリデーションが実行されませんが、updated_atは更新されコールバックは実行されます。

以上のことから、想定と異なる異常データが作成される可能性があるため、基本的にはupdateメソッドを使用するようにしましょう。

更新が成功した場合はtrueを、失敗した場合はnilを返却されます。

user = User.find(1)
user.update_attribute(:name, 'Messi')
# => true

update_attributes

update_attributesメソッドは前述のupdateメソッドのエイリアス(別名)となります。

そのため動作としてはupdateメソッドと同じになりますが、Rails6.0のリリースで非推奨化となりました。

そのため、update_attributesやupdate_attributes!は使用しないようにしましょう。

おすすめ書籍

以下は個人的にRubyやRailsの学習に大変役立った書籍です。

公式ドキュメントよりも分かりやすく解説されているため、体系的に学習を進めていきたい方はチェックしてみてください!

プロを目指す人のためのRuby入門 言語仕様からテスト駆動開発・デバッグ技法まで Software Design plus
created by Rinker
パーフェクト Ruby on Rails 【増補改訂版】 (Perfect series)
created by Rinker
ABOUT ME
Kohei Nishino
Webエンジニア、ブロガーです。新卒未経験で開発エンジニアとして大手SIerに入社し2年で退職。その後、派遣と業務委託を半年ほど経て都内のWeb系企業にエンジニアとして転職。しばらくは本業コミットのため技術的な話が多めです。Ruby on Rails / React.js / AWS