我该怎样用ecto在phoenix中实现回调?

时间:2015-12-27 18:40:29

标签: elixir phoenix-framework ecto

如果不推荐使用回调https://github.com/elixir-lang/ecto/issues/1114而Multi尚未实施,我应该怎么做?

2 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:0)

这取决于您要替换的回调。 正如Jason所说,对于before_insert,只需在变更集中调用一个函数。

如果您要替换before_updateafter_updateafter_delete,请创建一个功能,将所有内容包含在事务中。

我无法想到一个无法以这种方式处理的案例,但如果你这样做,请用特定的用例更新你的问题。