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

假设我们有标准的Post&Comment模型,Post有accepts_nested_attributes_for :commments:autosave => true set。

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

 @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或validation函数)之间进行区分

  1. 此评论未附加到post(无效)
  2. 此评论附加到未保存的post(有效)

不幸的是,仅仅从Comment中调用self.post不起作用,因为在上面,它会在保存发生之前返回nil。 在回调当然,我不(也不应该)访问@post,只能访问相关评论的自我。

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

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

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

在Rails bug跟踪器中有一个关于此问题的讨论和解决方案:

嵌套属性validation循环依赖

并提出了一项决议:

嵌套模型:build应直接指定父级

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

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

我认为你不能做到这一点。 另一方面,您的validation不应该失败,因为事务的顺序将在保存注释之前创建post记录。