Active Recordのattributeを使った更新メソッド
attributeとは
属性のことです。必要に応じて、既存の属性の型をオーバーライドすることができます。
attribute更新メソッド
これからさまざまな更新メソッドを見ていきたいと思います。
単一のattributeを更新する
指定した一つのattributeのみを変更したいときは、attribute=
を使います。オブジェクトの変更をするだけで、DBに保存はしません。
※保存が必要なときは別途save
やupdate
を行います。
user.name = 'Hoge' user.save # DB更新のためにsaveを使う
複数のattributeをまとめて更新する
特定のいくつかのattributeを変更したいときは、attributes=
かassign_attributes
を使います。これもオブジェクトの変更をするだけなので、DBに保存はしません。
※複数変更したいので複数形のattributesとなっています。
user.assign_attributes({ name: "Hoge", email: "sample@example.com" }) user.save # DB更新のためにsaveを使う
実際に以下の例文を使って説明していきます。
def update @user = User.find(params[:id]) # ① @user.assign_attributes(params[:user]) # ② if @user.save # ③ redirect_to @user else render :edit end end
①idで指定したユーザーが@userに入っています。
②@userにパラメーターで送られてきたuser情報を上書きしています。
③DBへ@userの上書きされた情報が保存されます。
なぜここでsave
を使わずにassign_attributes
を使っているのかというと、assign_attributes
はDBへの保存をしないのでSQLが複数回実行されてしまうことを防ぐことができるからです。
複数のattributeをまとめて更新かつ保存する
update
、save
、update_attributes
を使います。オブジェクトの変更をしてくれるだけでなく、DBに保存までしてくれます。またエラーが出た場合はDBへの保存は行わずにfalse
を返します。
user.update({ name: "Hoge", email: "sample@example.com" })
複数のattributeをまとめて更新かつ保存、例外処理を行う
update!
、save!
、update_attributes!
を使います。オブジェクトの変更をしてくれるだけでなく、DBに保存までしてくれます。またエラーが出た場合はDBへの保存は行わずに例外処理(ActiveRecord::RecordInvalid)をします。
user.update!({ name: "Hoge", email: "sample@example.com" })