学習記録

アウトプット用に作りました

Active Recordのattributeを使った更新メソッド

attributeとは

属性のことです。必要に応じて、既存の属性の型をオーバーライドすることができます。


attribute更新メソッド

これからさまざまな更新メソッドを見ていきたいと思います。

単一のattributeを更新する

指定した一つのattributeのみを変更したいときは、attribute=を使います。オブジェクトの変更をするだけで、DBに保存はしません。
※保存が必要なときは別途saveupdateを行います。

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をまとめて更新かつ保存する

updatesaveupdate_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" })

参考 : ActiveRecord の attribute 更新方法まとめ - Qiita