SQLite3データベースに単純なシードファイルを入力して、Filmテーブルにたくさんの映画エントリを作成し、コメントテーブルに保存されているこの映画にコメントを作成しようとしています。
formats = %w(Beta VHS IMAX HD SuperHD 4K DVD BlueRay)
30.times do
film = Film.create(title: "#{Company.bs}",
director: "#{Name.name}",
description: Lorem.paragraphs.join("<br/>").html_safe,
year: Rand(1940..2015),
length: Rand(20..240),
format: formats[Rand(formats.length)]
)
film.save
(Rand(0..10)).times do
film.comments.create( author: "#{Name.name}",
title: "#{Company.bs}",
content: Lorem.sentences(3).join("<br/>").html_safe,
rating: Rand(1..5)
)
end
end
Rake db:seedを実行すると、必ずエラーが発生します
ActiveRecord :: RecordNotSaved:親が保存されていない限り、createを呼び出すことはできません
フィルムやコメントにレコードは追加されません
私のfilm.rbファイルは
class Film < ActiveRecord::Base
has_many :comments
validates_presence_of :title, :director
validates_length_of :format, maximum: 5, minimum:3
validates_numericality_of :year, :length, greater_than: 0
validates_uniqueness_of :title
paginates_per 4
end
「フォーマット」の長さ制限により、「フォーマット」リストから選択されたフォーマットでフィルムを作成するときにエラーが発生する
ActiveRecord :: RecordNotSaved:親が保存されていない限り、createを呼び出すことはできません
これは、子の関連付け(コメント)を保存しようとしたときに、親(フィルム)がまだ保存されていない場合に発生します。
film
が保存されていないようです。コードを見ると、film = Film.create(...)
は検証に失敗しているため、film.comments.create(..)
は続行できません。失敗している検証について詳しく知ることなく、私が言えることはこれだけです。
Seeds.rbのすべての場所でcreate!(...)
を使用することをお勧めします。レコードが有効でない場合、bangバージョンでは例外が発生し、サイレントエラーの防止に役立ちます。