0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Rails はじめてマイグレーションファイルを作成したのでそのまとめ

Last updated at Posted at 2023-06-20

業務ではじめてマイグレーションファイルを作成しました。

行ったこと

①新規モデル作成
②新しく作成したモデルに、既存のテーブルからデータをインサート

①新規モデル作成

実行したいコンテナの中に入り

まず新しくモデルを作成しました
例)
ここでは
AfterHogesモデルを作成し
BeforeHogesモデルから
2023/01/01以降のデータをインサートしたい場合
と仮定して処理を進めます。

この場合、まずはAfterHogesモデルを作成します。

rails g model AfterHoges
とコマンドを打ちAfterHoges モデルを作成します。

その後、マイグレーションファイルの配下に新規でファイルを作成し
その中に各カラムの情報をファイルに記述します。

参考)☟このように

class AfterHoges < ActiveRecord::Migration[5.2]
  def change
    create_table :after_hoges do |t|
      t.references :hoge, foreign_key: true, null: false
      t.string :name, null: false

      t.timestamps
    end
  end
end

ファイルに記述がおわったら、下記コマンド
rails db:migrate
を実行すると、①の完了です。
新しくAfterHogesモデルが作成できました。
しかし、まだデータがはいっていません。
なので、②にいきます。

②新しく作成したモデルに、既存のテーブルからデータをインサート

先ほど作成した
AfterHoges モデル に BeforeHogesモデル
からdateが 2023/01/01 以降のデータを入れていきます。

*あくまで例です

# 既存のBeforeHogesモデルからデータを取得
before_hoges_data = BeforeHoges.where("date > ?", Date.new(2023, 1, 1))

# AfterHogesモデルにデータをいれる
before_hoges_data.each do |before_hoge|
  after_hoge = AfterHoge.create(
      hoge = before_hoge.hoge
      name = before_hoge.name
  )
end

データが入れば②も完成です。

役にたったコマンド

rails db:migrate:status
マイグレファイルの状態を出してくれます。
image.png

up → マイグレーション成功
down → マイグレーション失敗

rails db:migrate:down VERSION="ここにマイグレ前に戻したいMigration IDをかく"
例えば
もう一度マイグレーション前の状態に戻したい
となった際に
上のコマンドで任意のマイグレーションファイルのみ
マイグレーション前の状態に戻すことができます。
Migration ID は
rails db:migrate:status
をうつと分かります。

参考記事

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?