rails アプリケーションで初期データを作成する方法として、CSVファイルで作ったデータを反映させる方法があります。
前回の記事で紹介したエラーとは別の理由でハマったときの対処法を紹介します。
今回発生したエラーの前提条件は以下の通りです。
- 親子関係のあるテーブル
- 子のみデータを反映させる
- 親データは存在しない
テストをする際などで、親子関係にあるテーブルの子のテーブルのみデータが必要なときってありますよね。ダミーで親データを作ればいいのですがそれも面倒くさい、ってときです。
親データの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 でもエラーにならないようです。
コメント