【问题标题】:Rails rake db:seed not creating objects that belong_to another object?Rails rake db:seed 不创建属于另一个对象的对象?
【发布时间】:2015-08-01 03:24:49
【问题描述】:

在我的种子文件中,我有一堆属于用户的对象和属于用户的对象。

所以我有一个用户,它有一个图书馆,里面有很多书

在我的种子文件中,我设置了一些书籍,例如:

book = Book.new
book.attribute = "attribute"
book.save

library = Library.new
library.books << book
library.save

user = User.new
user.library = library
user.save

发生的情况是创建了一个用户,该用户具有预期的图书馆,但没有创建任何书籍。

当我运行 rails c 时

Book.all

我看到有 0 本书。

为什么会这样?

此外,我创建了一个图书池和 5 个用户,并为每个用户将上面创建的一些相同图书分配给该用户的图书馆。

但是,两者都没有

User.find(1).library.books

返回任何东西或

Book.all

返回任何东西。

编辑:修正了 = Library 而不是 = library 的错字

编辑:发布模型;

用户:

class User < ActiveRecord::Base

  before_create :create_library, only: [:new, :create]

  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable

  after_create :send_welcome_email

  has_one :library, dependent: :destroy
end

图书馆:

class Library < ActiveRecord::Base
  belongs_to :user
  has_many :books, dependent: :destroy

end

书:

class Book < ActiveRecord::Base
  validates :title, :author, presence: true
  belongs_to :library
  has_many   :sources
  has_one    :cover, class_name: 'BookCover', dependent: :destroy
  mount_uploader :cover, BookCoverUploader

  accepts_nested_attributes_for :sources, allow_destroy: true
  accepts_nested_attributes_for :cover, allow_destroy: true
end

注意,为了补充为图书模型创建相应的书皮,我只是在 Book 模型上传递了一个值“remote_cover_url”,carrierwave 使用该值在书上创建 BookCover。

【问题讨论】:

  • 日志说什么?您是否违反了 Book 课程的限制条件?
  • 你能展示你的模型吗?
  • @railsdog 当我在终端中运行 rake db:seed 时,它没有显示任何输出,因此基于它没有显示任何错误
  • @Ansar 您还想知道什么?这是一个模型 -> has_one -> 模型 -> has_many -> 图书关系
  • 您对Book 模型进行了一些验证吗?而不是book.save 尝试book.save!。执行此操作时是否出现错误?

标签: ruby-on-rails database activerecord rake seeding


【解决方案1】:

正如@newmediafreak 提到的,您可能对 Book 类进行了验证,以防止它被保存。

我建议您通过关联创建您的has_manyhas_one 实例:

user = User.create! library = user.library.create! book = user.books.create!(attribute: 'my attribute')

如果保存有任何问题,使用Object.create! 语法将导致错误。 Object.save 静默失败。

编辑 10:48 PDT

你有一个错字/错误:user.library = Library 应该是 user.library = library,但我仍然建议通过关联创建图书馆和书籍。

【讨论】:

  • 不幸的是,上述方法都不起作用。运行种子后,用户将使用各自的库创建,但即使使用 .save 也不会保存任何书籍!或做 Book.create!(params_hash_here)
  • 没有意义的是,在 Rails 控制台中,以我上面的方式播种数据在我得到 book1、library1 和 user1 并执行 library1.books
  • @AdamBronfin 奇怪的是它在控制台上工作。发布您的三个模型的代码(至少是关联和验证),我不会有什么坏处。
  • 所以在更仔细地执行这些步骤之后,在rails控制台中使用Book.create(hash)创建一本书的方法是有效的,但是在退出并重新进入控制台时,这本书不再停留即使我明确保存它并且它成功提交
猜你喜欢
  • 1970-01-01
  • 2018-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-02
  • 2016-01-27
  • 2012-03-07
  • 1970-01-01
相关资源
最近更新 更多