【Rails】関連付けたモデルの外部キーへのpresense: trueは必要ない

コードレビューで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

optional: trueってなに - Qiita

まとめ

課題作成時に参照していたRailsチュートリアルではpresence: true が記述されていたので必要なのだと完全に信じ込んでいた。 1つずつちゃんと理解して書かないといけないなと反省。 presence: true の理解を進める良い機会になったので良かった。

参照

Active Record バリデーション - Railsガイド

Rails5からbelongs_toアソシエーションの挙動が変わった - SHOYAN BLOG

optional: trueってなに - Qiita