elixir - 如何获取变更集字段的值

标签 elixir phoenix-framework

我正在尝试获取 :amount 字段的值。并据此计算报价。所以基本上我无法获得amount的值。

如有任何帮助,我们将不胜感激。

schema "loans" do
  field :amount, :integer
  field :email, :string
  field :isHigher, :boolean, default: false
  field :names, :string
  field :offer, :integer, default: 0
  field :phoneNumber, :string

  timestamps()
end

@doc false
def changeset(loan, attrs) do
  loan
  |> cast(attrs, [:amount, :names, :phoneNumber, :email, :offer, :isHigher])
  |> validate_format(:names, ~r/^[A-Z][a-z]+ ([A-Z][a-z]+\s*)*$/)
  |> validate_format(:phoneNumber, ~r/^[0-9-: ]+$/)
  |> validate_format(:email, ~r/^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/)
  |> custom(:amount)
end 

defp custom(%{params: params} = changeset, field) when is_map(params) do 
  value = Map.get(params, param)
  if is_prime(value) do
    put_change(changeset, :offer, 12)
  end  

  changeset
end 

defp custom(changeset) do
  changeset
end

def is_prime(x), do: (2..x |> Enum.filter(fn a -> rem(x, a) == 0 end) |> length()) == 1

最佳答案

一种不可变的语言

也就是说,下面是noop没有任何东西可以被改变(就地改变。)

if is_prime(value) do
  put_change(changeset, :offer, 12)
end 

此代码返回并立即丢弃 put_change/3 调用的结果。

要有条件地更改值,应返回结果:

value = Map.get(params, param)
if is_prime(value),
  do: put_change(changeset, :offer, 12),
  else: changeset

旁注:您从不使用传递给custom/2field,这让我认为您想要类似:

defp custom(%{params: %{} = params} = changeset, field) do 
  value = Map.get(params, to_string(field))
  if is_prime(value),
    do: put_change(changeset, :offer, 12),
    else: changeset
end

关于elixir - 如何获取变更集字段的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57759588/

相关文章:

elixir - Phoenix Controller 中的 current_user 由 Plug 传递

docker - 如何使用Phoenix Guides中的示例在生产模式下运行Elixir Phoenix Docker?

elixir - Ecto NoSQL 适配器的最低要求

Elixir - 函数定义的语法是什么?

oauth-2.0 - 由于 OAuth2 包中的错误原因而返回元组 { :option, :server_only, :honor_cipher_order}

elixir - 如何从 Phoenix 框架中的单独模型中创建带有选项和值的选择标签

elixir - 分配 @changeset 在 eex 模板中不可用

javascript - 如何在不重新启动服务器的情况下更改 Javascript?

elixir - 无法在 Phoenix Controller 和/或模板中获取配置值

elixir - Enum.map 中的 Enum.sum 返回字母而不是整数