在所有ActiveModel关联中传播Model#save

时间:2014-06-27 01:58:25

标签: ruby-on-rails activerecord activemodel

我有以下内容:

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并保存所有关联。我怎么能这样做?

1 个答案:

答案 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