かずきの日記

エンジニア・起業・人生の日記

Ruby on Rails 初心者向け 簡単 カラムのデフォルト値後から設定 エラーが出たら型を見てみる

どうもかずきです!

 

 今回はRuby on Rails カラムのデフォルト値設定について、軽く書いていこうと思います

 

 

簡単なタスクアプリがあるとして、ローカル環境でSequel Proを使ってデータベースの管理をしている場合で説明いたします(tasksテーブル)

タスクの状態を分けるときにカラム名を"status"にして、作業前をSTART(あとでSTARTボタンを作るため),作業中をDOING,完了済みをCOMPLETED(こちらはボタンを押すとCOMPLETED TASKというリストに移動するようにあとでします ついでに削除ボタンも作る予定)になるような仕様です

 

※この時点では、Sequel Proに手書きして、タスクの情報がビューに反映されるところまでしかできていません

 

ターミナル


$ rails g migration change_status_of_tasks
Running via Spring preloader in process 0000
      invoke  active_record
      create    db/migrate/20XXXXXXXXXX_change_status_of_task.rb

 上記のように$ rails g migration change_カラム名_of_テーブル名といった書き方でデフォルト変更のためのマイグレーションファイルを生成

 

 

生成されたマイグレーションファイルに以下のように記述 

 

db/migrate/_change_status_of_task.rb


class ChangeSrtatusOfToTask < ActiveRecord::Migration[5.0]
# ↓はtasksテーブルのtext型statusカラムのデフォルトを'START'に変更したいという記述 def up change_column :tasks, :status, :text, default: 'START' end
# ↓は元々の状態
def down change_column :tasks, :status, :text end end

 

 じゃあこれで

ターミナル


$ rails db:migrate

 

完了か?

 

実はこれだとエラーになります

 

こういったデフォルト設定や変更でエラーが出たら、カラムの型を確認してみて下さい

 

今回の場合はtasksテーブルのstatusカラムを作ったときに型をtextにしていたのですが、text型だとデフォルト設定ができないので、型をintegerやstringに変更しましょう

 

 

 

rails db migrate した後にエラーを出したマイグレーションファイルは以下のようにdownになっているのでつまりは実行できなかったファイルということ

ターミナル


$ bundle exec rails db:migrate:status

database: 作成中のアプリ名_development

 Status   Migration ID    Migration Name
--------------------------------------------------
   up     XXXXXXXXXXXX  Create tasks
   up     XXXXXXXXXXXX  Rename limit column to tasks
   up     XXXXXXXXXXXX  Add column to tasks
   up     XXXXXXXXXXXX  Create genres
   up     XXXXXXXXXXXX  Add userid to tasks
   up     XXXXXXXXXXXX  Remove userid to tasks
   up     XXXXXXXXXXXX  Add genreid to tasks
  down    XXXXXXXXXXXX  Change data status to task


 downのファイルは未実行なので普通に削除をするだけで大丈夫です

間違って実行できてしまったファイルの場合は $ rails db: rollback すれば実行前に戻ってくれます

 

カラムの型を変更したいときは

 

ターミナル


$ rails g migration change_data_status_to_tasks
Running via Spring preloader in process 00000
      invoke  active_record
      create  db/migrate/20XXXXXXXXXX_change_data_status_to_tasks.rb

 

 マイグレーションファイルを生成した後

db/migrate/_change_data_status_to_tasks.rb


class ChangeDataStatusToTask < ActiveRecord::Migration[5.0]
  def change
    change_column :tasks, :status, :string
  end
end

 このように型をstringに変更

 

これでカラムのデフォルト値を後から設定して マイグレートすれば作業は完了です

 

 

それでは!