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函数)之间进行区分
- 此评论未附加到post(无效)
- 此评论附加到未保存的post(有效)
不幸的是,仅仅从Comment中调用self.post
不起作用,因为在上面,它会在保存发生之前返回nil。 在回调当然,我不(也不应该)访问@post,只能访问相关评论的自我。
那么:从嵌套关联模型的角度来看,如何访问新记录的嵌套关联的父模型?
(FWIW,我正在使用它的实际样本允许人们创建一个裸的“评论”,然后如果没有一个,则会自动创建一个“post”来包含它。我已经简化了这个例子,所以它不是以不相关的方式特定于我的代码。)
我认为Rails不允许你这样做很奇怪。 它还会影响子模型中的validation。
在Rails bug跟踪器中有一个关于此问题的讨论和解决方案:
嵌套属性validation循环依赖
并提出了一项决议:
嵌套模型:build应直接指定父级
基本上,交易是,嵌套属性代码不设置子记录中的父关联。
在我链接的第二张票中提到了一些解决方法。
我认为你不能做到这一点。 另一方面,您的validation不应该失败,因为事务的顺序将在保存注释之前创建post记录。