变更集中字段的默认值

Koo*_*oro 9 elixir phoenix-framework

我有一个模型和变更集方法.我想要一个可选字段,如果它没有传递给chargeset,我想设置一个默认值.我怎样才能做到这一点?

Jus*_*ood 14

在创建模式时,可以通过将其传递给:defaultatom 来为其指定默认值.

schema "foo" do
  field :name, :string, default: "bar"
end
Run Code Online (Sandbox Code Playgroud)

  • 是.请记住,默认密钥是在编译时计算的.因此,如果您进行数据库访问以查找外键,它将仅在编译时进行数据库访问,而不是每次插入. (2认同)

Fre*_*Ben 6

如果您的需求很简单,贾斯汀的回答绝对是最优雅的,但就我而言,我需要更多的灵活性。我需要能够生成一个独特的、加密安全的值。

我在我的变更集管道中做到了:

def changeset(build_proxy, attrs) do
  build_proxy
  |> cast(attrs, [:avatar, :channel, :username, :service_base_url])
  |> gen_api_token_if_empty()
  |> validate_required([:avatar, :channel, :username, :service_base_url])
end                                                                                   

defp gen_api_token_if_empty(changeset) do
  case get_change(changeset, :api_token) do
    nil -> put_change(changeset, :api_token, gen_api_token())
     "" -> put_change(changeset, :api_token, gen_api_token())
      _ -> changeset
  end
end

defp gen_api_token() do
  :crypto.strong_rand_bytes(80)
  |> Base.url_encode64
  |> binary_part(0, length)
end
Run Code Online (Sandbox Code Playgroud)

  • 在您的示例中,我认为 `gen_api_token_if_empty/1` 总是会“认为”该字段为空 - 您没有在调用 `cast/3` 时将 `:api_token` 包含在 `permissed` 参数的列表中。 (2认同)