【发布时间】: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.bs和Name.name能按预期工作吗?另外,我强烈建议避免使用length作为 Film 属性名称,因为它也是 ruby 方法,最终可能会导致非常奇怪的情况。
标签: ruby-on-rails seeding