rails アプリケーションで初期データを作成する方法として、CSVファイルで作ったデータを反映させる方法があります。
「db/seeds.rb」にコードを書いて、「rails db:seed」を実行すると反映してくれます。
この「rails db:seed」を実行してデータが反映されなくてハマったときの対処法を紹介します。
db/seeds.rb の内容
発注データを作成しようとして、次のようなコードを「db/seeds.rb」に記入しました。
# coding: utf-8
require "csv"
CSV.foreach('db/dbo_T_purchase.csv') do |row|
Purchase.create(:p_number => row[0],
:p_code => row[1],
:p_date => row[2],
・
・
・
・
)
end
csvファイルはキチンとできています(確認済)。
rails db:seed の実行結果
Rails> rails db:seed
Rails>
エラーが表示されず、正常終了したかのような感じです。
で、確認してみると・・・
Rails> rails c
Loading development environment (Rails 5.2.4.3)
irb(main):001:0> Purchase.all
Purchase Load (1.6ms) SELECT "purchases".* FROM "purchases" LIMIT $1 [["LIMIT", 11]]
=> #<ActiveRecord::Relation []>
irb(main):002:0>
空です。1件も反映されていません。。
対処法
# coding: utf-8
require "csv"
CSV.foreach('db/dbo_T_purchase.csv') do |row|
Purchase.create!(:p_number => row[0],
:p_code => row[1],
:p_date => row[2],
・
・
・
・
)
end
わかりにくいですが 「テーブル名 .create」のところを 「テーブル名 .create!」に変更してあります。
こうすることによって、validationエラーを返してくれるようになりました。
エラー内容は、カラム名のスペルミスでした(恥)
まとめ
create、save、updateは、validationに失敗した場合にfalseを返すそうです。validationに失敗しても、「rails db:seed」自体はエラーではないので、そのまま正常終了してしまうみたいです。
それに対して、 create!、save!、update!、はvalidationに失敗した場合にActiveRecord::RecordInvalid例外を発生するそうです。そうなると「rails db:seed」も異常終了となり、エラー内容も表示してくれるみたいです。
こんなことで丸々一日ハマってしまいました。確か前回も同じようにハマったような・・
なので、備忘録としてアップしておきます。
コメント