Rails:如何访问新记录的嵌套关联的父模型?

时间:2009-12-13 09:36:01

标签: ruby-on-rails associations callback

假设我们有标准的Post&评论模型,其中帖子设置为accepts_nested_attributes_for :commments:autosave => true

我们可以创建一个新帖子以及一些新评论,例如:

@post = Post.new :subject => 'foo'
@post.comments.build :text => 'bar'
@post.comments.first # returns the new comment 'bar'
@post.comments.first.post # returns nil :(
@post.save # saves both post and comments simultaneously, in a transaction etc
@post.comments.first # returns the comment 'bar'
@post.comments.first.post # returns the post 'foo'

但是,我需要能够在Comment(例如,来自其before_save或验证函数)之间区分

  1. 此评论未附加到帖子(无效)
  2. 此评论附加到未保存的帖子(有效)
  3. 不幸的是,仅仅从Comment中调用self.post不起作用,因为在上面,它会在保存发生之前返回nil。在回调当然,我不(也不应该)访问@post,只能访问相关评论的自我。

    那么:从嵌套关联模型的角度来看,如何访问新记录的嵌套关联的父模型?

    (FWIW,我正在使用它的实际样本允许人们创建一个裸的“评论”,然后如果还没有一个,则会自动创建一个“帖子”来包含它。我简化了这个例子所以它不是以不相关的方式特定于我的代码。)

2 个答案:

答案 0 :(得分:6)

我认为Rails不允许你这样做很奇怪。它还会影响子模型中的验证。

在Rails错误跟踪器中有一个很多讨论且没有解决方案的票证:

  

Nested attributes validations circular dependency

提议的决议:

  

nested models: build should directly assign the parent

基本上,交易是,嵌套属性代码不会在子记录中设置父关联。

在我链接的第二张票中提到了一些解决方法。

答案 1 :(得分:0)

我认为你不能这样做。另一方面,您的验证不应该失败,因为交易的顺序将在保存评论之前创建帖子记录。