Railsアプリケーションのmigrationファイル内mにnull: falseと記述するべきか、modelファイルにpresende: trueと記述するべきかどうかについてまとめます。
先に結論を言いますと、両方で設定したほうが良いようです。
migraionファイル
migrationファイルに、null: falseと設定している場合、そのカラムが空のまま保存されるのを防ぐ事ができます。
例
class CreateUsers < ActiveRecord::Migration def change create_table :reviews do |t| t.string :name t.string :email null: false t.timestamps null: false end end end
modelファイル
一方、モデルファイル内で、対象カラムにpresence: trueとバリデーションの設定しても、空のまま保存されることを防げます。
例
class User < ApplicationRecord validates :email, presence: true end
両方で設定したほうが良い
modelで設定するからmigrationファイルで設定をしなくても良いんじゃないかと思ってたことがあります。それで良いのでしょうか?
結論、両方で設定したほうが良いです。
migrationファイルでの設定は、データベースに対する設定です。つまり、データベースにデータが保存されるときに、対象ファイルが空のときに保存がされないようにするための設定です。
一方のmodelファイル内でのvalidatesの設定は、Railsアプリケーション側の判定です。modelファイル内でpresence: trueを設定しおくと、対象カラムが空のときに、ブラウザ上からはレコードが保存ができません。しかし、DBに直接アクセスしてSQLを実行すれば、データを保存できてしまいます。
そんなことが起きないよう、migraiotnファイルとmodelファイルの両方で設定しましょう。
Ruby on Railsをこれから本格的に勉強したい人は「エンジニアになるための600時間のプログラミング学習に耐え抜くコツ」という記事がおすすめです。