【问题标题】:You cannot call create unless the parent is saved error when seeding in rails在 Rails 中播种时,除非父项被保存错误,否则您不能调用 create
【发布时间】:2015-05-08 08:42:28
【问题描述】:

我正在尝试使用一个简单的种子文件填充我的 SQLite3 数据库,该种子文件应该在 Film 表中创建一堆电影条目,然后为这些电影创建一些 cmets 存储在 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

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

【问题讨论】:

  • 能否添加film.rb文件。我相信由于一个错误,这部电影没有得到保存。因此,当您尝试为该电影创建 cmets 时,它不会被创建。我们需要先找出导致电影无法创建的错误。
  • 或者只是将 Film.create 更改为 Film.create! 并且您应该使用哪个验证来阻止电影被保存。
  • 我同意@Coderhs。我们需要看看 Film belongs_to 是什么。您的模型中有一些逻辑需要首先保存电影的父级。一旦我们知道 Film 属于_to,您将需要首先为父级添加种子数据,这应该根据逻辑是否合理来创建子数据。
  • @basia 如果我运行 Film.create!(...) 我收到此错误消息 ActiveRecord::RecordInvalid: translation missing: ro.activerecord.errors.messages.record_inval
  • @Cristi 结尾不见了,record_invalid 之后有什么东西吗?你确定Company.bsName.name 能按预期工作吗?另外,我强烈建议避免使用 length 作为 Film 属性名称,因为它也是 ruby​​ 方法,最终可能会导致非常奇怪的情况。

标签: ruby-on-rails seeding


【解决方案1】:

ActiveRecord::RecordNotSaved: 除非父对象被保存,否则不能调用 create

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

film 好像没有保存。查看代码,film = Film.create(...) 似乎没有通过验证,因此film.comments.create(..) 无法继续。 在不知道哪个验证失败的情况下,我只能这么说。

我建议在seeds.rb 中的任何地方使用create!(...)。如果记录无效,bang 版本将引发异常,并有助于防止静默失败。

【讨论】:

  • 感谢您和@coderhs。我的错误对你隐藏,但你的建议帮助我跟踪它并了解更多信息。 film.format 是从这个格式列表中随机选择的,并且在film.rb 中限制在 3 到 5 之间。但是格式列表包含大量更长的“格式” 1. 使用 create!查看错误是一个很好的提示 2. ro.activerecord.errors.messages 也是通过正确安装该 gem 解决的 i18n 错误
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-28
  • 1970-01-01
  • 2020-10-19
  • 2021-05-16
相关资源
最近更新 更多