デイトラの講座の中で、ユーザーと記事を紐付けるために「マイグレーション」を学ぶ機会があったので軽くまとめておこうと思います。
Contents
マイグレーションとは、かなりざっくり言うと、テーブルレイアウトを作成・変更するための仕組みです。
記事の内容やユーザーの情報などを保存できるようにするためには、このマイグレーションが必要になります。
今回は、ArticleとUserのモデルを紐つけます。
要は「どのユーザーがどの記事を書いたのか」を判別できるようにするのが目的です。
まずは、マイグレーションファイルを作成します。
ざっくり言うと、テーブルを作成するための設計図みたいな物です。
ターミナル上で下記コードを実行します。
$rails g migration AddUserIdToArticles
また、「migration」~以下の名称は上のように統一した方が良いとされています。
マイグレーションのファイル名は以下のようにすると良い!!
AddXxxxToテーブル名
RemoveXxxxToデーブル名
のように決まった名前にしておけば、マイグレーションの骨組みを作ってくれるようです。
また、処理の内容が一眼で分かりやすいと言うのも理由です。
コマンドでコードを実行すると、db > migrationフォルダに新規ファイルが作成されます。
class AddUserIdToArticles < ActiveRecord::Migration[6.0]
def change
end
end
そして、テーブルにカラムを追加していきます。
今回はArticlesモデルにuserと言うカラムを追加したいので、以下のようなコードを書きます。
class AddUserIdToArticles < ActiveRecord::Migration[6.0]
def change
add_reference :articles, :user
end
end
ちなみに、「add_reference~」と書いているところを以下のようにしてもOKですが、上の書き方が推奨されているようです。
class AddUserIdToArticles < ActiveRecord::Migration[6.0]
def change
add_column :articles, :user_id, :integer
end
end
ちなみにマイグレーションファイルで利用できるメソッドは上の物以外でもたくさんあります。
このままではデータベースに反映されていません。
(=テーブルが作成されていません)
ですので、ターミナル上で下記コマンドを実行します。
rails db:migrate
schema_migrationsテーブルとdb/migrateフォルダーを比較して、未実行のマイグレーションファイルを実行する。
これでarticlesモデルにuserのカラムが登録されました。
念のため、schema.rbファイルを見てみると「t.integer “user_id」が追加されているのが分かります。
ActiveRecord::Schema.define(version: 2020_08_09_055419) do
create_table "articles", force: :cascade do |t|
t.string "title"
t.text "content"
t.datetime "created_at", precision: 6, null: false
t.datetime "updated_at", precision: 6, null: false
t.integer "user_id"
t.index ["user_id"], name: "index_articles_on_user_id"
end
データベース(db)の構造を可視化したもの。
要は、どのテーブルにどんなカラムなどが配置されているかが分かるファイルになっています。
そしてarticle.rbにも下のようにuser_idの情報が追加されています。
# == Schema Information
#
# Table name: articles
#
# id :integer not null, primary key
# content :text
# title :string
# created_at :datetime not null
# updated_at :datetime not null
# user_id :integer
#
# Indexes
#
# index_articles_on_user_id (user_id)
マイグレーションを作成しただけでは、まだユーザーと記事の情報は繋がっていないので、最後に「user.rb」と「article.rb」に数行のコードを書かないといけません。
まずは、article.rbに下記コードを追加します。
belongs_to :user
1つの記事にとってユーザーの数は、1人しかいないので、「user」のように単数形にします。
次にuser.rbに下記コードを追加します。
has_many :articles, dependent: :destroy
ユーザー1人に対して記事は複数存在する可能性があるため、「articles」と複数形になります。
また、後半の「dependent〜」はユーザーが退会などした際に、記事も削除するためのものです。
今回は、ユーザー情報と記事を紐付けるために、マイグレーションを使用しました。
最後にマイグレーションの作成〜実行までの流れをまとめて終わりとします。
①マイグレーションファイルの作成
→$rails g migration
②マイグレーションフファイルにカラムを追加
→$add_reference
③マイグレーションを実行
→$rails db:migrate
コメントを残す