【发布时间】:2016-04-01 17:12:07
【问题描述】:
如果回调将被弃用 https://github.com/elixir-lang/ecto/issues/1114 并且 Multi 尚未实现,我应该怎么做?
【问题讨论】:
标签: elixir phoenix-framework ecto
如果回调将被弃用 https://github.com/elixir-lang/ecto/issues/1114 并且 Multi 尚未实现,我应该怎么做?
【问题讨论】:
标签: elixir phoenix-framework ecto
您可以只调用变更集中的“回调”函数。例如,如果您有一个变更集用于创建需要生成标识符 GUID 的产品,您可能已经通过回调实现了这一点。
defmodule Product do
before_insert :generate_identifier
defp generate_identifier(changeset) do
...
end
end
现在您可以在更明确的变更集函数中调用它。
defmodule Product do
def create_changeset(model, attrs) do
model
|> cast(attrs, @required_fields, @optional_fields)
|> generate_identifier
|> validate_present(:name)
end
defp generate_identifier(changeset) do
...
end
end
您可以通过管道进入验证器和其他类型的回调。
【讨论】:
这取决于您要替换的回调。
正如 Jason 所提到的,对于 before_insert,只需调用变更集中的函数即可。
如果您尝试替换 before_update、after_update 或 after_delete,请创建一个函数,将您的所有内容包装在事务中。
我想不出不能以这种方式处理的案例,但如果您这样做,请使用特定用例更新您的问题。
【讨论】:
update_changeset 函数来应用更新回调。
before_update 确实有好处。但是,如果需要保存更改以执行操作,则它不适用于 after_update 或 after_delete。