seeds.rbでデータ投入する際、createよりもcreate!を使うべき?
Railsアプリケーションで、初期データを投入する方法として、「'seeds' feature」というものがあります。 db/seeds.rbファイルにRubyコードを書き、rake db:seedを実行することで利用できます。
先日とあるアプリケーションにて次のようなことが起こりました。
- seeds.rbにてcreateでデータを投入していた
- modelに変更を加えたので、seed.rbを修正
- 修正後、rake db:seedを実行、特にエラーも無く正常終了
- ところが、結果のデータを見ると、あるべきデータが投入されていない。
そこで、createをcreate!に変更してみたところ、validationエラーでデータ投入が失敗していることがわかりました。 modelの変更に伴い、createで指定するパラメータの追加が必要だったのですが、指定方法に誤りがあり、validationで失敗してデータが投入されていなかった、というわけです。
createとcreate!の違い
create、save、updateは、validationに失敗した場合にfalseを返します。それに対して、 create!、save!、update!、はvalidationに失敗した場合にActiveRecord::RecordInvalid例外を発生します。
参考 Active Record の基礎 | Rails ガイド
というわけで
以上のことから、seeds.rbでデータ投入する際、データ投入が失敗していることを検出するために、createよりもcreate!を使うべきでは、と思ったのですが、どうなんでしょう。 こう変えた時にデメリットあるのでしょうか。
追記
Railsチュートリアルにも記載がありました。 http://railstutorial.jp/chapters/updating_and_deleting_users?version=4.2#code-db_seed