after_touch 回调无权访问子项的更新属性
after_touch callback does not have access to updated attributes of children
我不确定如何解决以下蛋鸡问题。
我有一个名为 Batch
的模型,它在验证时触及父模型 Status
- 通过 before_validation
回调。
在父模型的 after_touch
回调中 - Status
,(状态 has_many 批次) - 我正在检查 Status
实例的所有子实例是否都将属性设置为 true。
我面临的问题是所有这些都是在一个数据库提交中执行的,所以我的 Batch
的子实例将要更新的属性设置为 true 并没有持久化并且在 after_touch
parent 中的回调没有以 true 响应,导致所有这些都失败了。
您认为不对数据库进行两次提交就可以让它工作吗?
还有一个重要信息:我正在检查的属性是一个虚拟属性,在子模型的 after_find
回调中分配了值(Batch
)
是的,
您可以在父模型中添加 validates_associated :batches。
并在保存时在批处理(子)模型中添加验证以检查属性是否为真。
希望我回答清楚。
谢谢
经过思考,我更改了我的子模型更新触发 Status
更新的逻辑。
我没有在父级中使用 after_touch
回调,而是将所有代码移到了属于 Batch
的回调中。我还必须更改用于 after_save
的回调类型,以便在 after_save
回调中使用 self.status.batches
之前将批处理实例持久保存到数据库中。
我不确定如何解决以下蛋鸡问题。
我有一个名为 Batch
的模型,它在验证时触及父模型 Status
- 通过 before_validation
回调。
在父模型的 after_touch
回调中 - Status
,(状态 has_many 批次) - 我正在检查 Status
实例的所有子实例是否都将属性设置为 true。
我面临的问题是所有这些都是在一个数据库提交中执行的,所以我的 Batch
的子实例将要更新的属性设置为 true 并没有持久化并且在 after_touch
parent 中的回调没有以 true 响应,导致所有这些都失败了。
您认为不对数据库进行两次提交就可以让它工作吗?
还有一个重要信息:我正在检查的属性是一个虚拟属性,在子模型的 after_find
回调中分配了值(Batch
)
是的,
您可以在父模型中添加 validates_associated :batches。
并在保存时在批处理(子)模型中添加验证以检查属性是否为真。
希望我回答清楚。
谢谢
经过思考,我更改了我的子模型更新触发 Status
更新的逻辑。
我没有在父级中使用 after_touch
回调,而是将所有代码移到了属于 Batch
的回调中。我还必须更改用于 after_save
的回调类型,以便在 after_save
回调中使用 self.status.batches
之前将批处理实例持久保存到数据库中。