Elixir 变更集中字段的默认值

Elixir 变更集中字段的默认值,elixir,phoenix-framework,Elixir,Phoenix Framework,我有一个模型和变更集方法。我希望有一个可选字段,如果它没有传递到chargeset,我希望设置一个默认值。我如何才能做到这一点?当您创建模式时,您可以通过将:default原子传递给它一个默认值 schema "foo" do field :name, :string, default: "bar" end 如果你的需求很简单,贾斯汀的回答肯定是最优雅的,但在我的情况下,我需要多一点灵活性。我需要能够生成一个唯一的、加密安全的值 我是在我的变更集管道中完成的: def changeset(

我有一个模型和变更集方法。我希望有一个可选字段,如果它没有传递到chargeset,我希望设置一个默认值。我如何才能做到这一点?

当您创建模式时,您可以通过将
:default
原子传递给它一个默认值

schema "foo" do
  field :name, :string, default: "bar"
end

如果你的需求很简单,贾斯汀的回答肯定是最优雅的,但在我的情况下,我需要多一点灵活性。我需要能够生成一个唯一的、加密安全的值

我是在我的变更集管道中完成的:

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

在发送到
cast
之前,先做
params=Map.put_new(params,“field”,default_value)
?@Dogbert这是公认的默认方式吗?例如,一个用户的角色:
params=Map.put_new(params,:Role_id,2)
您可以默认这样的关联吗?是的。请记住,默认键是在编译时计算的。因此,如果您通过数据库访问来查找外键,它将仅在编译时进行数据库访问,而不是每次插入都进行数据库访问。更好的解决方案可能是创建您自己的EXTO类型,并让它为您自动生成值。@JustinWood感谢您的建议!听起来不错。我现在是个不死药,你指的是什么?