Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails:如何访问新记录的父模型&x27;什么是嵌套关联?_Ruby On Rails_Associations_Callback - Fatal编程技术网

Ruby on rails Rails:如何访问新记录的父模型&x27;什么是嵌套关联?

Ruby on rails Rails:如何访问新记录的父模型&x27;什么是嵌套关联?,ruby-on-rails,associations,callback,Ruby On Rails,Associations,Callback,假设我们有标准的Post&Comment模型,Post具有接受\u嵌套的属性\u用于:commments和:autosave=>true集 我们可以创建一个新帖子,同时添加一些新评论,例如: @post = Post.new :subject => 'foo' @post.comments.build :text => 'bar' @post.comments.first # returns the new comment 'bar' @post.comments.first.pos

假设我们有标准的Post&Comment模型,Post具有
接受\u嵌套的属性\u用于: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'
但是,我需要能够区分注释内(例如,它的before_save或validation函数)和

  • 此评论未附加到帖子(无效)
  • 此评论附加到未保存的帖子(有效)
  • 不幸的是,仅仅从注释中调用
    self.post
    是不起作用的,因为根据上面的说明,它在保存之前返回nil。当然,在一次回调中,我并没有(也不应该)访问@post,只能访问相关评论的self

    因此:如何从嵌套关联模型的角度访问新记录的嵌套关联的父模型


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

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

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

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

    和一项拟议决议:

    基本上,处理方法是,嵌套属性代码不会在子记录中设置父关联


    我链接到的第二张罚单中提到了一些解决办法。

    它将如何做到这一点?您不想设置parent_id列,因此必须在子项上添加一些隐藏属性?您可以设置属性(例如parent、children),而无需设置必要的_id。这就是它目前保存嵌套模型的方式-它只是有一个不递归的缺陷。@Sai根据发布的链接,我可以看到这可以通过使用选项的
    inverse\u来实现。@elquimista自己也试过了,
    inverse\u在这种情况下没有帮助。@lulalalala你能详细说明一下,它对你的情况没有帮助吗?