コードレビューでpresense: true
の使い方を指摘されたので調べてみました。
結論
関連付けたモデルの外部キーへのpresense: true
は必要ない。
アソシエーションによって紐付けられた外部キーの存在しない値やnil
の場合へのpresenceバリデーションは自動的に付与される(Rails5から)ので不要になる。
Rails5からbelongs_toアソシエーションの挙動が変わった - SHOYAN BLOG
# 親モデル class User < ApplicationRecord has_many :books end # 子モデル class Book < ApplicationRecord belongs_to :user validates :user_id, presence: true # 不要 end
optional: true でバリデーションをパスできる
関連付けたモデルの外部キーのnil
を許可するにはoptional: true
を使えばok。
# 親モデル class User < ApplicationRecord has_many :books end # 子モデル class Book < ApplicationRecord belongs_to :user, optional: true # nilを許可する end
まとめ
課題作成時に参照していたRailsチュートリアルではpresence: true
が記述されていたので必要なのだと完全に信じ込んでいた。
1つずつちゃんと理解して書かないといけないなと反省。
presence: true
の理解を進める良い機会になったので良かった。
参照
Active Record バリデーション - Railsガイド