【rails】マイグレーションファイルの修正

※本サイトで紹介している商品・サービス等の外部リンクには、アフィリエイト広告が含まれる場合があります。

マイグレーションファイルを修正したい

アプリは以下の手順で作成していた

  1. 記事コンテンツを作成できるようにした
  2. ユーザーアカウントを登録できるようにした
  3. ユーザーじゃないと記事を作成できないようにした

本来であれば、ユーザーありきの記事なのに、ユーザーがいない状態での記事が出来上がってしまっている


マイグレーションファイルの修正

実行させたい順番を決める

マイグレーションファイルのファイル名には日付が入っている

rails db:migrate記事が古い順に実行されるので、以下の順にしたい

  1. ユーザー登録「20240825025236_devise_create_users.rb」
  2. 記事の投稿「20240810041507_create_articles.rb」

ファイルを実行順に並び替える

rails db:migrateは記事が古い順に実行されるので、ファイル名を修正する

  1. ユーザーアカウントを作成するファイル
    「20240825025236_devise_create_users.rb」を
  2. 記事を作成するファイル
    「20240810041507_create_articles.rb」より早く読み込ませたい
  3. 早い日にち「20240809025236_devise_create_users.rb」に修正する

不要なマイグレーションファイルの整理

「20240825120840_add_user_id_to_articles」で、ユーザーと記事の関連付けをおこなっていた


記事作成と関連付けを一緒にする

「20240810041507_create_articles.rb」を開く

t.references :user, null: falseを追加する

class CreateArticles < ActiveRecord::Migration[6.0]
  def change
    create_table :articles do |t|
      t.references :user, null: false
      t.string :title
      t.text :content
      t.timestamps
    end
  end
end
  1. t.references :user
    記事とユーザー情報を紐づける
  2. null: false
    「このカラムには絶対に値(user_id)が入っていないとダメ!」という制約を加える
  3. 「userがいないのにarticleがある」という状況は絶対生まれなくなる

「null: false」と「validation」の違い

validationの場合

「:title」がないと絶対に保存しません

class Article < ApplicationRecord
  validates :title, presence: true

これはActive Recordの中で宣言しているだけに過ぎない

→ validationに設定したとおり、view上では「保存できません」と表示される

ただ、SQL(データベース)側では関係なく保存することができてしまう


null: falseオプションの場合

値「user_id」がないと絶対に保存しません

class CreateArticles < ActiveRecord::Migration[6.0]
  def change
    create_table :articles do |t|
      t.references :user, null: false

null: falseオプションでデータベース側制約をかけることで、保存されることは有り得なくなる

#DAY21