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.

マイグレーションを自作する テーブルの作成、Null制約のfalseをする

Posted at

テーブルを作成する

create_table :products do |t|
  t.string :name
end

このようなマイグレーションファイルを作成したい。

テーブルを作成するマイグレーションファイルを作成

bin/rails g migration CreateProducts name:string

出典

class CreateProducts < ActiveRecord::Migration[7.0]
  def change
    create_table :products do |t|
      t.string :name

      t.timestamps
    end
  end
end

t.timestampsとは?

p39 rails generateで生成した場合は自動的に記述されます
created_at,updated_atというカラムを作成します。

出典

テーブルの編集

create_table :products, options: "ENGINE=BLACKHOLE" do |t|
  t.string :name, null: false
end

こういう風に編集したい。

既存のマイグレーションを変更する

マイグレーションを自作していると、ときにはミスしてしまうこともあります。いったんマイグレーションを実行してしまった後では、既存のマイグレーションを単に編集してもう一度マイグレーションをやり直しても意味がありません。Railsはマイグレーションが既に実行済みであると認識しているので、rails db:migrateを実行しても何も変更されません。このような場合には、マイグレーションをいったんロールバック(rails db:rollbackなど)してからマイグレーションを修正し、それからbin/rails db:migrateを実行して修正済みバージョンのマイグレーションを実行する必要があります。

一般に、既存のマイグレーションを直接変更するのはよくありません。
既存のマイグレーションを変更すると、自分自身はもちろん、共同作業者も余分な作業を強いられます。さらに、既存のマイグレーションがproduction環境で実行中の場合、ひどい頭痛の種になるでしょう。既存のマイグレーションを直接修正するのではなく、修正用のマイグレーションを新たに作成してそれを実行するのが正しい方法です。これまでコミットされてない(より一般的に言えば、これまでdevelopment環境以外にデプロイされたことのない)マイグレーションを新たに生成し、それを編集するのが害の少ない方法です。

revertメソッドは、以前のマイグレーション全体またはその一部を逆進させるためのマイグレーションを新たに書くときにも便利です(上述の以前のマイグレーションに戻すを参照してください)。

出典

マイグレーションをデータベースに反映させる

***********@mbp ***********% rails db:migrate
== 20221221072255 CreateProducts: migrating ===================================
-- create_table(:products)
   -> 0.0609s
== 20221221072255 CreateProducts: migrated (0.0610s) ==========================
create_table :products, options: "ENGINE=BLACKHOLE" do |t|
  t.string :name, null: false
end

options: "ENGINE=BLACKHOLE"は既存のマイグレーションを直接変更するしかなかった。
実際これの意味はわからない。

カラムに対してNull制約をfalseにする

class CreateProducts < ActiveRecord::Migration[7.0]
  def change
    create_table :products do |t|
      t.string :name

      t.timestamps
    end
  end
end
bin/rails g migration ChangeColumnOnProducts
class ChangeColumnOnProducts < ActiveRecord::Migration[7.0]
  def change
    change_column_null :products, :name, false
  end
end

change_column_null :products, :name, false
change_columnの他に、not null制約を変更するchange_column_nullメソッド

出典

**********@mbp **********: % rails db:migrate                            
== 20221224080150 ChangeColumnOnProducts: migrating ===========================
-- change_column_null(:products, :name, false)
   -> 0.1211s
== 20221224080150 ChangeColumnOnProducts: migrated (0.1212s) ==================

感想

テーブルの作成はできた。
Null制約もfalseにできた。
しかしoptions: "ENGINE=BLACKHOLE"は直接書き込まなければできなかった。
まだまだこれから勉強だ。

********@mbp *********** % rails db:migrate 
== 20221221072255 CreateProducts: migrating ===================================
-- create_table(:products, {:options=>"ENGINE=BLACKHOLE"})
   -> 0.0244s
== 20221221072255 CreateProducts: migrated (0.0245s) ==========================

== 20221224080150 ChangeColumnOnProducts: migrating ===========================
-- change_column_null(:products, :name, false)
   -> 0.0138s
== 20221224080150 ChangeColumnOnProducts: migrated (0.0139s) ==================


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?