migrationで初期データを生成するのは辞めた方がよい。
今日はテスト書いてる途中に割り込んできた機能追加タスクをこなしながら、ハマったことをつらつらと書いてみます。
こいつのいい解決方法ご存知のかたおられましたら、ご教授くださいm_ _m
==
なんか同じ過ちをたびたび繰り返しているような気がするが、Userモデルのvalidateとかbefore_create、after_createあたりで別のモデル呼び出してて...みたいなときに、migrationで初期Userデータを生成するのは辞めておいた方がよいのかもな。
新しいモデルをUserモデルのbefore_createとかで使おうとしたら、一瞬でrake db:migrateが通らなくなってしまう。。。
今回の場合だと、UserモデルのvalidateでKeywordFilterというモデルを呼び出してフィルタ処理を追加したのだが、KeywordFilterテーブルが生成されるより前に初期Userデータを生成しようとして、rake db:migrateでkeyword_filtersテーブルが無いよ!!っておこられた訳で。。。まぁそら無いわな。
前はUserにPointを付けるとかいうので、after_createで初期ポイント生成処理とか入れたら、Pointモデルがネーよ!!って起こられたし。。。学習の無いヤツだ、俺は。
で、これの解決策。
初期データ生成のmigrationの番号を後ろにすれば解決だけど、これ、サービス開始前ならいざしらず、開始後だと結構やっかい。rake db:migrateで現状にテーブル追加はできても、別環境ではrake db:migrateが通らないという状況に。。。
migrationってVERSION指定はできても、特定の番号(0**_create_...rbの**のとこ)だけをムシするとか、特定の番号だけを実行するってのはできないので、もうこれはどうしようもないのだろうか??人のアプリダウンロードしてきて、rake db:migrateでエラーとか出たら結構凹むよね。。
Enginesとかだと、昔は
-
rake db:migrate:engines
とかできてたので、
-
rake db:migrate:initialize
とかできればいいのになぁ〜
「初期データはmigration使って登録するのが便利なのだけれど、必ずテーブル定義が終わった後で初期データを登録したい」
って要望を、うまく解決する方法ってないかしらん?












この記事がお役に立ちましたら、一言コメントもらえると嬉しいですm_ _m