【デイトラDAY20】マイグレーションの復習

デイトラの講座の中で、ユーザーと記事を紐付けるために「マイグレーション」を学ぶ機会があったので軽くまとめておこうと思います。

マイグレーションとは?

マイグレーションとは、かなりざっくり言うと、テーブルレイアウトを作成・変更するための仕組みです。


記事の内容やユーザーの情報などを保存できるようにするためには、このマイグレーションが必要になります。


マイグレーションファイル作成〜実行までの流れ

今回は、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


rais 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
スキーマファイル(schema.rb)とは?

データベース(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」に数行のコードを書かないといけません。


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

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です