🖥

#Rails の ActiveRecord で optional: true は validates_presence_of を無効化するの

2019/11/11に公開

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の森の奥深く。

参考

optional: trueってなに - Qiita

Rails5からbelongs_to関連はデフォルトでrequired: trueになる - Qiita

ActiveRecord::Associations::ClassMethods

Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/2708

チャットメンバー募集

何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ

Twitter

https://twitter.com/YumaInaura

公開日時

2019-11-11

Discussion