Rails

【Rails】バリデーションチェックを回避する「optional: true」について簡単にまとめてみた

Rails

 

今回は、バリデーションチェックを回避する「optional: true」について簡単にまとめたので解説したいと思います。デフォルト(記載しない場合)では「optional: false」になっているとのことですが、trueとfalseではどのような違いがあるのでしょうか?

optional: trueとは

optional: trueとは、アソシエーションによって紐づけられた外部キーの値が存在していなくても、データベースに保存することができるオプションです。通常、外部キーの値が空白(null)であれば、バリデーションで弾かれてしまいます。

外部キーがないと弾かれてしまう挙動は、Rails5以降から導入されたんだって!

 

例を見てみましょう。

ItemモデルとImageモデルがあり、アソシエーションが組まれていたと仮定します。

↓ Itemモデル

class Item < ApplicationRecord
  has_many :images
end

 

↓ Imageモデル

class Image < ApplicationRecord
  belongs_to :item
end

 

この場合、item_idが外部キーとしてimagesがテーブルに存在しています。デフォルト(optional: falseの場合)では、ここに値が入っていないとバリデーションで弾かれてしまいます。

↓ item_idに値が必要

Image from Gyazo

 

しかしここで本題である「optional: true」をつけると、外部キーに値が入っていなくてもバリデーションチェックをパスすることができます。

↓ Imageモデル

class Image < ApplicationRecord
  belongs_to :item, optional: true
end

 

↓ item_idがnullでもDBに保存できる

Image from Gyazo

まとめ

  • optional: trueとは、アソシエーションによって紐づけられた外部キーの値が存在していなくても、データベースに保存することができるオプションである
  • Rails5以降からは、外部キーがないと弾かれてしまう挙動がデフォルトに設定されている
  • belongs_to: ~の後に、optional: trueを記述する

参考記事

Github

https://github.com/rails/rails/issues/18233

Railsガイド

https://railsguides.jp/association_basics.html

 

 

今回は、バリデーションチェックを回避する「optional: true」について簡単に解説しました。バリデーションに弾かれてしまう場合には、「optional: true」をつけて回避してあげてくださいね。