明けましておめでとうございます。という挨拶はほどほどに、今日の気づきを。

どこかで rake db:reset は、以下のコマンドの省略であると教えてもらった。

rake db:drop
rake db:create
rake db:migrate
rake db:seed

そう信じていた。

なんならログも

Dropped database 'hoge_development'
Dropped database 'hoge_test'
Created database 'hoge_development'
Created database 'hoge_test'
-- create_table("customers", {:options=>"ENGINE=InnoDB DEFAULT CHARSET=utf8", :force=>:cascade})
   -> 0.0453s
create Customers

みたいにそれっぽいのを出力していた。が、違うことが判明した。

  def change
    add_column :users, :role, :int
  end

こんな感じのmigrationをgenerateで作ったとする。で、これを試しに実行する。うまく行ったのをみて、

  def change
    add_column :users, :role, :int, null: false, default: 0, after: :email
  end

こんな感じに書き換えた。で、 rake db:reset をする。当然、イチから作るものと思っている僕は、属性も順番も指定の通りに書き換わると思ったら、そうなっていないのだ。
書き方が間違っていたのかと四苦八苦していたが、試しに rake db:reset ではなく、

rake db:drop
rake db:create
rake db:migrate
rake db:seed

を個別に実行したところ、期待どおりの動きになった(書き方あってるやろがい!)。
どうもRailsくんは、migration番号(ファイル名についてる数字で、DBにも書き込まれてる)などを信頼して、省エネで再構築した風にみせているようだ。

これ以上は深入りすると火傷しそうなのでやめておく。
とりあえず

rake db:drop && rake db:create && rake db:migrate && rake db:seed

をスニペット登録して、これ使おう。


2019-01-09追記

rake db:reset でみているのは、 schema.rb という指摘をいただいた。なるほど! schema.rb くん、そういうときに活躍するんやな…なんやこいつって思ってた…

https://qiita.com/hirohero/items/2f29334878b0cb525bda

によると、

db:drop
db:create
db:schema:load

の省略らしいです。 db:schema:load ……そういうのもあるのか。