我正在尝试获取 :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
最佳答案
elixir是一种不可变的语言。
也就是说,下面是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/2
的field
,这让我认为您想要类似:
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/