web-dev-qa-db-ja.com

rails

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

「フォーマット」の長さ制限により、「フォーマット」リストから選択されたフォーマットでフィルムを作成するときにエラーが発生する

15
Cristi

ActiveRecord :: RecordNotSaved:親が保存されていない限り、createを呼び出すことはできません

これは、子の関連付け(コメント)を保存しようとしたときに、親(フィルム)がまだ保存されていない場合に発生します。

filmが保存されていないようです。コードを見ると、film = Film.create(...)は検証に失敗しているため、film.comments.create(..)は続行できません。失敗している検証について詳しく知ることなく、私が言えることはこれだけです。

Seeds.rbのすべての場所でcreate!(...)を使用することをお勧めします。レコードが有効でない場合、bangバージョンでは例外が発生し、サイレントエラーの防止に役立ちます。

32
messanjah