テーブルを作成する
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) ==================