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に変更
これでカラムのデフォルト値を後から設定して マイグレートすれば作業は完了です
それでは!