ActiveRecord何时会保存关联?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ActiveRecord何时会保存关联?相关的知识,希望对你有一定的参考价值。
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
这样的内部实例变量,在创建它们时会添加关联。然后,当保存模型时,它会遍历这些关联并保存它们。
不幸的是没有像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列。这就是为什么:
- 将对象添加到已保存父级的关联中会保存新子级。
- 在未保存的父级上添加对象关联不保存(没有外键值)
- 如果正在保存未保存的父级并且在关联高速缓存中具有一些子对象,则会保存这些对象以更新foreign_key。
不确定这是否会对其他人有所帮助,但最近我在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来保存所有子对象。
以上是关于ActiveRecord何时会保存关联?的主要内容,如果未能解决你的问题,请参考以下文章
ActiveRecord 在保存主对象时是不是保存了belongs_to 关联?