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

前端之家收集整理的这篇文章主要介绍了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!(…).如果记录无效,爆炸版本将引发异常并帮助防止静默失败.

猜你在找的Ruby相关文章