Elixir phoenix framework如何在Ecto模型中设置默认值

Elixir phoenix framework如何在Ecto模型中设置默认值,elixir,phoenix-framework,ecto,Elixir,Phoenix Framework,Ecto,我想在Phoenix Framework中为模型设置默认值,我尝试过: def new(conn, _params) do user = get_session(conn, :user) if is_nil user do user = Repo.get_by(User, name: "guest") conn = put_session(conn, :user, user) end changeset = Module.c

我想在Phoenix Framework中为模型设置默认值,我尝试过:

  def new(conn, _params) do

    user = get_session(conn, :user)
    if is_nil user do
        user = Repo.get_by(User, name: "guest")
        conn = put_session(conn, :user, user)
    end

    changeset = Module.changeset(%Module{})

    changeset
    |> Ecto.Changeset.put_change(:user, user)
    |> Ecto.Changeset.put_change(:version, "0.0.0")
    |> Ecto.Changeset.put_change(:visibility, "public")

    render(conn, "new.html", user: user, changeset: changeset)
  end
如何在模型中设置默认值,使其在呈现new.html时显示

顺便说一句,这里是我的默认变更集函数。我不知道怎么用它?我假设使用一个EXTO.changeset.put_的变化在管道后的演员

  def changeset(model, params \\ :empty) do
    model
    |> cast(params, @required_fields, @optional_fields)
  end

根据您的变更集函数(此处未提供),有几种方法

你可以做:

changeset = Module.changeset(%Module{user: user, version: "0.0.0", visibility: "public"})
另一个选项是将参数传递给变更集函数:

changeset = Module.changeset(%Module{}, %{user: user, version: "0.0.0", visibility: "public"})
但是需要注意的是,如果您绑定管道的结果,则具有
put\u change/3
功能的版本也可以工作:

更改:

changeset = Module.changeset(%Module{})

changeset
|> Ecto.Changeset.put_change(:user, user)
|> Ecto.Changeset.put_change(:version, "0.0.0")
|> Ecto.Changeset.put_change(:visibility, "public")
致:


另一个选项是在迁移过程中在数据库级别设置默认值。如果您查看的
:default
选项,您将看到如何执行此操作。

太好了,谢谢!您认为在变更集功能中(即在模型中而不是控制器中)会更好吗?也许这是更好的方法?这取决于用例。如果您只希望在向用户展示新表单时设置默认值,那么我将使用我建议的第一个选项。如果您在多个地方使用此功能,则可以使用自定义变更集功能。如果每次创建这种类型的新模型时都需要它,那么就使用数据库作为默认值。太棒了,我一直使用数据库默认值,这是我一直想要的,但不知道存在:-)
changeset =
  Module.changeset(%Module{})
  |> Ecto.Changeset.put_change(:user, user)
  |> Ecto.Changeset.put_change(:version, "0.0.0")
  |> Ecto.Changeset.put_change(:visibility, "public")