【问题标题】:Rails: How can I access the parent model of a new record's nested associations?Rails:如何访问新记录的嵌套关联的父模型?
【发布时间】:2009-12-13 09:36:01
【问题描述】:

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

我们可以与一些新的 cmets 一起创建一个新帖子,例如:

@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. 此评论附加到一个未保存帖子(有效)

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

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

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

【问题讨论】:

    标签: ruby-on-rails associations callback


    【解决方案1】:

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

    Rails 错误跟踪器中有一张经过大量讨论但没有解决此问题的票:

    Nested attributes validations circular dependency

    以及提议的解决方案:

    nested models: build should directly assign the parent

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

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

    【讨论】:

    • 它会怎么做呢?您不想设置 parent_id 列,所以您必须在孩子上添加一些隐藏属性?
    • 您可以设置一个属性(例如父、子)而不设置必要的_ids。这就是它目前进行嵌套模型保存的方式 - 它只是有一个不递归的缺陷。
    • @Sai 按照发布的链接,我可以看到这可以使用inverse_of 选项来实现。
    • @elquimista 尝试过自己,inverse_of 在这种情况下没有帮助。
    • @lulalala 你能详细说明一下,它对你的情况没有帮助吗?
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-26
      • 1970-01-01
      相关资源
      最近更新 更多