rails db:seed でデータが反映されずにハマりました(その2)

プログラミング

rails アプリケーションで初期データを作成する方法として、CSVファイルで作ったデータを反映させる方法があります。

前回の記事で紹介したエラーとは別の理由でハマったときの対処法を紹介します。

今回発生したエラーの前提条件は以下の通りです。

  1. 親子関係のあるテーブル
  2. 子のみデータを反映させる
  3. 親データは存在しない

テストをする際などで、親子関係にあるテーブルの子のテーブルのみデータが必要なときってありますよね。ダミーで親データを作ればいいのですがそれも面倒くさい、ってときです。

親データのIDカラムに適当な数値を入れて、「rails db:seed」を実行するとこんなエラーが出ました。

Rails> rails db:seed
rails aborted!
ActiveRecord::AssociationTypeMismatch: Bbbbb(#35665240) expected, got "1" which is an instance of String(#22347280)
c:/Rails/db/seeds.rb:21:in `block in <top (required)>'
c:/Rails/db/seeds.rb:20:in `<top (required)>'
bin/rails:4:in `require'
bin/rails:4:in `<main>'
Tasks: TOP => db:seed
(See full trace by running task with --trace)
ActiveRecord::AssociationTypeMismatch: Bbbbb(#35665240) expected, got "1" which is an instance of String(#22347280)

親テーブルのIDが入るカラムのところで「ActiveRecord::AssociationTypeMismatch:」となってしまいました。データタイプが違うのかといろいろ試しましたが、結果は同じでした。

グーグル先生にお聞きしたところ、モデルに「 optional: true」というのをつければよいとのこと。

class Aaaaa < ApplicationRecord
  belongs_to :bbbbb , optional: true
end

この指定を付け加えると、親テーブルのidカラムがnil でもエラーにならないようです。

コメント