【问题标题】:How should I implement callbacks in phoenix with ecto?我应该如何使用 ecto 在 phoenix 中实现回调?
【发布时间】:2016-04-01 17:12:07
【问题描述】:

如果回调将被弃用 https://github.com/elixir-lang/ecto/issues/1114 并且 Multi 尚未实现,我应该怎么做?

【问题讨论】:

    标签: elixir phoenix-framework ecto


    【解决方案1】:

    您可以只调用变更集中的“回调”函数。例如,如果您有一个变更集用于创建需要生成标识符 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
    

    您可以通过管道进入验证器和其他类型的回调。

    【讨论】:

      【解决方案2】:

      这取决于您要替换的回调。 正如 Jason 所提到的,对于 before_insert,只需调用变更集中的函数即可。

      如果您尝试替换 before_updateafter_updateafter_delete,请创建一个函数,将您的所有内容包装在事务中。

      我想不出不能以这种方式处理的案例,但如果您这样做,请使用特定用例更新您的问题。

      【讨论】:

      • 您还可以添加一个 update_changeset 函数来应用更新回调。
      • 这对before_update 确实有好处。但是,如果需要保存更改以执行操作,则它不适用于 after_updateafter_delete
      猜你喜欢
      • 1970-01-01
      • 2012-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-24
      • 2018-12-10
      相关资源
      最近更新 更多