在保存父模型和嵌套关联之后,在父模型上创建后运行Rails

时间:2016-02-17 22:23:10

标签: ruby-on-rails activerecord

我正在我的Rails应用程序中创建一个新资源,发送到我的端点的JSON如下所示:

{
  "resource1": {
    "resource2_attributes": [{
      "name": "Test 1",
      "resource3_attributes": [{
        "field1": "test"
      }]
    }]
  }
}

嵌套属性正常工作,并且正在设置父模型上的关联。

但是,当保存顶级resource1时,会触发模型上的after_create回调(在保存关联之前)。 after_create上的Resource1回调使用子关联作为其逻辑。

如何让我的Rails应用程序保存父模型以及子关联,然后运行回调?

1 个答案:

答案 0 :(得分:1)

原来Rails无法完成我在本篇文章时所做的工作。

我被建议添加一个after_add关联回调,但是传递给该方法的记录没有设置id,因为它还没有将它提交到数据库。 after_add方法需要访问id,因为它创建了相关记录,但如果没有id则无法访问。

下一个选项:

而是在关联上使用after_add回调,因为在父模型上添加ActiveRecord回调是行不通的,因为执行顺序是这样的:Save Parent - >运行父回调 - > Save Children,当“Run Parent Callback”部分需要子数据时,但由于操作顺序尚未创建,因此无法获取子数据。

因此,我最终采用的路线是将回调放在子模型上,并引用我所需数据的父关联。

不是最喜欢的方法,因为我不能在父模型中拥有逻辑,在我看来,它应该属于哪个,但至少一切都运行顺畅,数据才有意义。