除非在轨道中播种时保存父节点错误,否则无法调用create

时间:2015-03-06 17:09:41

标签: ruby-on-rails seeding

我正在尝试用一个简单的种子文件填充我的SQLite3数据库,该文件应该在Film表中创建一堆电影条目,然后为存储在Comments表中的这部电影创建一些注释。

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

使用从“格式”列表中选择的格式创建电影时,“格式”的长度限制会引发错误

1 个答案:

答案 0 :(得分:28)

  

ActiveRecord :: RecordNotSaved:除非保存父级,否则无法调用create

当您尝试保存子关联(注释)但父(电影)尚未保存时,会发生这种情况。

似乎film未保存。查看代码时,似乎film = Film.create(...)验证失败,因此film.comments.create(..)无法继续。 如果不知道哪个验证失败了,我就可以说了。

我建议在seeds.rb中随处使用create!(...)。如果记录无效并且有助于防止无声失败,那么爆炸版将引发异常。