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

# テーブルを作成する
```rb
create_table :products do |t|
  t.string :name
end
```
このようなマイグレーションファイルを作成したい。
### テーブルを作成するマイグレーションファイルを作成
```
bin/rails g migration CreateProducts name:string
```
#### 出典
https://www.sejuku.net/blog/60950#:~:text=%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB%E3%82%92%E4%BD%9C%E6%88%90,g%20migration%20CreateSample

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

      t.timestamps
    end
  end
end
```
### ```t.timestamps```とは？
p３９ ```rails generate```で生成した場合は自動的に記述されます
```created_at```,```updated_at```というカラムを作成します。
#### 出典
https://gihyo.jp/book/2020/978-4-297-11462-6

# テーブルの編集
```rb
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メソッドは、以前のマイグレーション全体またはその一部を逆進させるためのマイグレーションを新たに書くときにも便利です（上述の以前のマイグレーションに戻すを参照してください）。
#### 出典
https://railsguides.jp/active_record_migrations.html#%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B:~:text=%E6%8A%91%E5%88%B6%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%99%E3%80%82-,5%20%E6%97%A2%E5%AD%98%E3%81%AE%E3%83%9E%E3%82%A4%E3%82%B0%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%92%E5%A4%89%E6%9B%B4%E3%81%99%E3%82%8B,-%E3%83%9E%E3%82%A4%E3%82%B0%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3

https://prograshi.com/framework/rails/how-to-migrate-after-modification-of-migration-file/#:~:text=%E3%81%AA%E3%81%9C%E3%83%9E%E3%82%A4%E3%82%B0%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%84%E3%81%AE%E3%81%8B%EF%BC%9F%EF%BC%88%E5%A4%89%E6%9B%B4%E3%81%8C%E5%8F%8D%E6%98%A0%E3%81%95%E3%82%8C%E3%81%AA%E3%81%84%E3%81%AE%E3%81%8B%EF%BC%9F%EF%BC%89
# マイグレーションをデータベースに反映させる
```
***********@mbp ***********% rails db:migrate
== 20221221072255 CreateProducts: migrating ===================================
-- create_table(:products)
   -> 0.0609s
== 20221221072255 CreateProducts: migrated (0.0610s) ==========================
```
```rb
create_table :products, options: "ENGINE=BLACKHOLE" do |t|
  t.string :name, null: false
end
```
```options: "ENGINE=BLACKHOLE"```は既存のマイグレーションを直接変更するしかなかった。
実際これの意味はわからない。

### カラムに対してNull制約をfalseにする
```rb
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
```
```rb
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メソッド
#### 出典
https://railsguides.jp/active_record_migrations.html#%E3%82%AB%E3%83%A9%E3%83%A0%E4%BF%AE%E9%A3%BE%E5%AD%90:~:text=change_column%E3%81%AE%E4%BB%96%E3%81%AB%E3%80%81not%20null%E5%88%B6%E7%B4%84%E3%82%92%E5%A4%89%E6%9B%B4%E3%81%99%E3%82%8Bchange_column_null%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89

```
**********@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) ==================


```