ruby-on-rails – 除非在rails中播种时保存父节点错误,否则无法调用create

我正在尝试用一个简单的种子文件填充我的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: You cannot call create unless the parent is saved

并且没有记录添加到电影或评论

我的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: You cannot call create unless the parent is saved

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

看来电影没有保存.看一下代码,看来film = Film.create(…)验证失败,因此film.comments.create(..)无法继续.
如果不知道哪个验证失败了,我就可以说了.

我建议在seeds.rb中到处使用create!(…).如果记录无效,爆炸版本将引发异常并帮助防止静失败.

相关文章

validates:conclusion,:presence=>true,:inclusion=>{...
一、redis集群搭建redis3.0以前,提供了Sentinel工具来监控各...
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣...
上一篇博文 ruby传参之引用类型 里边定义了一个方法名 mo...
一编程与编程语言 什么是编程语言? 能够被计算机所识别的表...
Ruby类和对象Ruby是一种完美的面向对象编程语言。面向对象编...