ActiveRecord何时会保存关联?

问题描述 投票:33回答:2

1)我知道根据autosave: true,它会在http://railsapi.com/doc/rails-v2.3.8/classes/ActiveRecord/AutosaveAssociation.html时保存关联

2)我知道它将保存像这样构造的关联

book = Book.new(name: 'foo')
book.authors.build(name: 'bar') #has_many
book.save

或者喜欢

book = Book.new(name: 'foo')
book.build_author(name: 'bar') #has_one
book.save

3)我认为在分配或添加关联时也会保存关联

book = Book.new(name: 'foo')
book.author = Author.new(name: 'bar')
book.save

要么

book = Book.new(name: 'foo')
book.authors << Author.new(name: 'bar')
book.save

但是,我有一个复杂的错误,涉及的东西不能自动保存,当我期望它。所以,我想通过检查book进行调试,以验证我认为将要保存的内容实际上将被保存。

TL; DR;保存关联时检查什么内部状态?我假设模型有一个像associations_to_save这样的内部实例变量,在创建它们时会添加关联。然后,当保存模型时,它会遍历这些关联并保存它们。

ruby-on-rails activerecord associations has-many
2个回答
27
投票

不幸的是没有像association_to_save这样的东西。然而,有一些规则说明什么时候被保存。你可以在这里找到:http://guides.rubyonrails.org/association_basics.html。要点:4.1.5(belongs_to),4.2.5(has_one),4.3.4(has_many)和4.4.4(habtm)。

更新:

在has_many关联的情况下,如果child.new_record,子节点在保存父节点时保存?返回true(子节点尚未保存到db),或者需要更新foreign_key列。这就是为什么:

  1. 将对象添加到已保存父级的关联中会保存新子级。
  2. 在未保存的父级上添加对象关联不保存(没有外键值)
  3. 如果正在保存未保存的父级并且在关联高速缓存中具有一些子对象,则会保存这些对象以更新foreign_key。

1
投票

不确定这是否会对其他人有所帮助,但最近我在Rails 5.2中遇到了类似的问题。

当尝试将对象保存2层深时,如果顶级和第一级对象已经保存,则我的测试失败。 IE浏览器。

book_cover.persisted? == true
book_cover.book.persisted? == true

page = book_cover.book.pages.new

page.persisted? == false

# After saving the top level object
book_cover.save
page.persisted? == false

# After saving the immediate parent of page
book_cover.book.save
page.persisted? == true

由于父“书籍封面”不是新对象“页面”的直接父级,因此保存“书籍封面”实际上并没有最终保存“页面”对象。

根据情况,我只是在“book”对象上明确调用save来保存所有子对象。

© www.soinside.com 2019 - 2024. All rights reserved.