🖥
#Rails の ActiveRecord で optional: true は validates_presence_of を無効化するの
Class
class User < ApplicationRecord
has_many :books
end
class Book < ApplicationRecord
belongs_to :user
end
挙動
- Rails 5からのデフォルト挙動 では、user_id を持たない book は作成できない
- optional: true を指定すると、 user_id を持たない book を作成できる
- 外部キー制約を持たない場合や
foreign_key: { on_delete: :nullify }
の制約をつけている場合、どちらの指定でも user を削除できる
っぽい。
ちょっと分かりづらい。
その理由は
Rails的に assciation の validation が実行されるのは、その class のレコードの操作時だからかなと思った。
たとえば user が削除されたときは book の制約が走るわけではないから、的な。
親クラスの指定
dependent: :destroy
dependent: :delete_all
dependent: :nullify
で挙動を制御したら良いかな。
class User < ApplicationRecord
has_many :books, dependent: :nullify
end
Active Record Associations — Ruby on Rails Guides
本当に?
まだまだ奥深いRailsの森の奥深く。
参考
Rails5からbelongs_to関連はデフォルトでrequired: trueになる - Qiita
ActiveRecord::Associations::ClassMethods
Original by Github issue
チャットメンバー募集
何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。
公開日時
2019-11-11
Discussion