我有以下内容:
class User < ActiveRecord::Base
has_one :blog
end
class Blog < ActiveRecord::Base
belongs_to :user
end
如果我这样做:
@user = User.new
@blog = Blog.new
@blog.title = 'hi'
@user.blog = @blog
@user.save
为什么/如何在不保存@blog
对象的情况下将@blog
对象保存到数据库?
例如,如果我继续上面的例子:
@user.reload
@user.blog.title
#=> 'hi'
神奇地将@blog
保存到数据库!
奇怪的是,如果我的@blog
有其他关联,它似乎不会将它们保存到数据库中。
背后的一般行为/逻辑是什么?我的@blog
有其他关联,我希望能够简单地调用@user.save
并保存所有关联。我怎么能这样做?
答案 0 :(得分:1)
行为是关联被&#34;自动保存&#34;当未指定autosave
选项时,默认情况下autosave
选项为true
,条件为&#34;新的关联记录将被保存,但更新的关联不会保存&# 34。
以下描述取自&#34; Active Record Autosave Association&#34;上的Rails API文档。清楚地解释了这个特征:
AutosaveAssociation是一个自动处理的模块 保存父项时保存关联的记录。此外 保存,它还会销毁任何标记为的相关记录 破坏。 (参见mark_for_destruction和marked_for_destruction?)。
保存父级,其关联以及标记的销毁 关联,都发生在交易中。这永远不应该离开 数据库处于不一致状态。
如果任何关联的验证失败,则会显示错误消息 将适用于父母。
请注意,这也意味着标记为销毁的关联不会获胜 被直接销毁。然而,他们仍将被标记为 破坏。
请注意,autosave:false与不声明不同:autosave。什么时候 :自动保存选项不存在,然后是新的关联记录 已保存,但未保存更新的关联记录。
如果您不希望在创建/更新或销毁父对象时保存或销毁关联对象,请在声明关联时指定autosave: false
:
class User < ActiveRecord::Base
has_one :blog, autosave: false
end
这样,当创建user
时,您就不会看到已保存的相关blog
。您必须手动保存,并在关联的save
实例上调用blog
。