如何在插入时为 Ecto 模型中的某些字段设置一些值

dar*_*rko 2 elixir ecto phoenix-framework

我在 Ecto 模型中有几个字段,我想为其插入 a) 默认值 b) 在我进行插入时生成值。我怎样才能做到这一点?在“变更集”中,我应该在哪个函数中执行此操作?

mic*_*ala 5

是的,此类事情的常见位置是变更集功能。如果您需要区分插入和更新时发生的情况,您可以定义多个变更集函数并在更新或插入数据时调用适当的函数。例如:

defmodule MyApp.Schema do
  #...

  def insert_changeset(struct, params) do
    struct
    |> common_changeset(params)
    |> put_change(:foo, "bar") # writing a field to the changeset
    # ...
  end

  def update_changeset(struct, params) do
    struct
    |> common_changeset(params)
    # ...
  end

  defp common_changeset(struct, params) do
    struct
    |> cast(params, [:foo, :bar])
    # ...
  end
end
Run Code Online (Sandbox Code Playgroud)

如果默认值是静态值,您还可以在架构中default:field/3宏使用 ecto 的选项- 它相当于为defstruct声明中的字段提供值。