どうも、はじめです。
前回はUPDATEについて書いてみました。
はじめの一歩 -Rails ActiveRecord編- UPDATE
今回はUPDATEの際readonlyやvalidationで更新ができなかった場合に関して書いていこうと思います。
はじめに
今回も前回と同じテーブルを使用しようと思います。
usersテーブル
[id: 1, user_name: 'Aさん'],
[id: 2, user_name: 'Bさん'],
[Id: 3, user_name: 'Cさん']
itemsテーブル
[id: 1, item_name: 'Rubyの本'],
[id: 2, item_name: 'Railsの本'],
[id: 3, item_name: 'PHPの本']
user_itemsテーブル(userが持っているitemを管理するテーブル)
[id: 1, user_id: 1, item_id: 1],
[id: 2, user_id: 1, item_id: 2],
[id: 3, user_id: 2, item_id: 3]
関連性
user : user_item => 1 : n
item : user_item => 1 : n
ではまず【readonly】で更新できなかった場合の対処法を書いてみます。
readonly
下のように更新をしてみます。
[id: 2, user_id: 1, item_id: 2]
↓
[id: 2, user_id: 1, item_id: 3]
手元でなかなかreadonlyになる状況を再現できなかったため以下の方法でreadonlyにしました。
user_item = UserItem.readonly(true)
この状態で変更しようとしても更新できません。
user_item.find(2).update(item_id: 3)
# ActiveRecord::ReadOnlyRecord: UserItem is marked as readonly
これだとreadonlyでrollbackされてしまいます。
モデルからインスタンスを取得する際にreadonlyをfalseにしてあげれば更新が可能になります。
user_item = UserItem.readonly(false)
user_item.find(2).update(item_id: 3)
次に【validation】でエラーになった場合です。
validation
ユーザーの登録の際、user_nameを入力必須にしていたとします。
入力必須のバリデーションを定義するにはUserモデルに対し以下のように定義します。
# app/models/user.rb
class User < ApplicationRecord
validates :user_name, presence: true
end
この状態でユーザー名を空で登録しようとするとエラーになります。
user = User.new
user.save
次のように記述することで一時的にバリデーションを無効にすることができます。
user = User.new
user.save(:validate => false)
最後に
validationを一時的に無効にすることは可能ですが、
今回例としてあげたのケースの場合、
DBでuser_nameにnot null制約がかかっているとバリデーションを無視することができても、
DBへの登録時にエラーになってしまいますので気をつけましょう。
次回はupdate_attributeとupdate_attributesを使ってみようと思います。
0 件のコメント:
コメントを投稿