こんなテーブルが既にあって、
id | file_path |
---|---|
1 | reports/48/1531826234/output.pdf |
2 | reports/48/1531826588/output.pdf |
ここで dir_prefix というカラムがやはり欲しくなったので not NULL で追加したい。
かつ中身は file_path から引っ張ってきたい。
という時の migration の書き方を考えた。
- null: false のカラムは NULL の状態では作れないよ(それはそう)
- default: 0 とかもやりたくない
- 既存のレコードには、別カラムのデータを超簡単に加工して突っ込みたい。
rake にコンバート処理を書いて後から流してもいいけれども、リリース後の手作業を減らしたいし、正しいデータが入るまでに時間差が発生する
ということで、postgresql の文字列関数を使った。
class AddDirPrefixToReports < ActiveRecord::Migration
add_column :reports, :dir_prefix, :string
change_column :reports, :dir_prefix, "VARCHAR USING split_part( CAST(file_name as VARCHAR), '/', 3 )"
change_column :reports, :dir_prefix, :string, null: false
end
実行するとデータが入った状態で not NULL のカラム追加ができている。
id | file_path | dir_prefix |
---|---|---|
1 | reports/48/1531826234/output.pdf | 1531826234 |
2 | reports/48/1531826588/output.pdf | 1531826588 |
基本的には migration にはデータのコンバートを含めない派ですが、
例外としてこの程度であればメリットが大きいと感じます。