为什么 Phoenix 需要参数中的所有嵌套资源,使用 cast_assoc 或 put_assoc
Why Phoenix require all nested resource in the parameter, Using cast_assoc or put_assoc
案例是one_to_many,我想同时插入和更新必要的最小嵌套资源。
根据https://hexdocs.pm/ecto/Ecto.Changeset.html#cast_assoc/3,cast_assoc
要求我们update/insert嵌套资源与参数中的所有关联。如果我们不包括所有关联,cast_assoc 为缺失的关联调用 :on_replace
操作。
我觉得使用凤凰模板生成的表单是可以的,因为表单每次都会在参数中发送所有关联。但是,如果此功能适用于 JS 框架,我可以发送必要的最小关联,这些关联在 Web 浏览器上发生了变化。在这样的用例中,我是否也可以在事务中重复更新,或者像模板一样重复更新?
我觉得这种行为有点棘手。而且我觉得最好将操作显式添加到参数中而不是 :on_replace
你怎么看?
这不是 Phoenix 的要求,而是 Ecto 的要求。如果 Ecto 没有与您的模式相关的所有信息,那么它无法可靠地创建准确的变更集。
我不是很理解你的具体问题,但如果你想在不重新提供关联的情况下更新记录,那么创建一个不涉及关联的单独的变更集函数。
案例是one_to_many,我想同时插入和更新必要的最小嵌套资源。
根据https://hexdocs.pm/ecto/Ecto.Changeset.html#cast_assoc/3,cast_assoc
要求我们update/insert嵌套资源与参数中的所有关联。如果我们不包括所有关联,cast_assoc 为缺失的关联调用 :on_replace
操作。
我觉得使用凤凰模板生成的表单是可以的,因为表单每次都会在参数中发送所有关联。但是,如果此功能适用于 JS 框架,我可以发送必要的最小关联,这些关联在 Web 浏览器上发生了变化。在这样的用例中,我是否也可以在事务中重复更新,或者像模板一样重复更新?
我觉得这种行为有点棘手。而且我觉得最好将操作显式添加到参数中而不是 :on_replace
你怎么看?
这不是 Phoenix 的要求,而是 Ecto 的要求。如果 Ecto 没有与您的模式相关的所有信息,那么它无法可靠地创建准确的变更集。
我不是很理解你的具体问题,但如果你想在不重新提供关联的情况下更新记录,那么创建一个不涉及关联的单独的变更集函数。