※本サイトで紹介している商品・サービス等の外部リンクには、アフィリエイト広告が含まれる場合があります。
マイグレーションファイルを修正したい
アプリは以下の手順で作成していた
- 記事コンテンツを作成できるようにした
- ユーザーアカウントを登録できるようにした
- ユーザーじゃないと記事を作成できないようにした
本来であれば、ユーザーありきの記事なのに、ユーザーがいない状態での記事が出来上がってしまっている
マイグレーションファイルの修正
マイグレーションファイルのファイル名には日付が入っている
rails db:migrate
は記事が古い順に実行されるので、以下の順にしたい
- ユーザー登録「20240825025236_devise_create_users.rb」
- 記事の投稿「20240810041507_create_articles.rb」
rails db:migrate
は記事が古い順に実行されるので、ファイル名を修正する
- ユーザーアカウントを作成するファイル
「20240825025236_devise_create_users.rb」を - 記事を作成するファイル
「20240810041507_create_articles.rb」より早く読み込ませたい - 早い日にち「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
t.references :user
記事とユーザー情報を紐づけるnull: false
「このカラムには絶対に値(user_id)が入っていないとダメ!」という制約を加える- 「userがいないのにarticleがある」という状況は絶対生まれなくなる
「null: false」と「validation」の違い
「:title」がないと絶対に保存しません
class Article < ApplicationRecord
validates :title, presence: true
これはActive Recordの中で宣言しているだけに過ぎない
→ validationに設定したとおり、view上では「保存できません」と表示される
ただ、SQL(データベース)側では関係なく保存することができてしまう
値「user_id」がないと絶対に保存しません
class CreateArticles < ActiveRecord::Migration[6.0]
def change
create_table :articles do |t|
t.references :user, null: false
null: false
オプションでデータベース側に制約をかけることで、保存されることは有り得なくなる
#DAY21