Elixir 如何获取变更集字段的值
我正在尝试获取Elixir 如何获取变更集字段的值,elixir,phoenix-framework,Elixir,Phoenix Framework,我正在尝试获取: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, :
: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
schema“loans”do
字段:金额,:整数
字段:电子邮件,:字符串
字段:isHigher,:布尔值,默认值:false
字段:名称,:字符串
字段:offer,:integer,默认值:0
字段:phoneNumber,:字符串
时间戳()
结束
@虚假文件
def变更集(贷款、属性)do
贷款
|>演员阵容(attrs,[:amount,:name,:phoneNumber,:email,:offer,:isHigher])
|>验证_格式(:名称,~r/^[A-Z][A-Z]+([A-Z][A-Z]+\s*)*$/)
|>验证_格式(:phoneNumber,~r/^[0-9-:]+$/)
|>验证格式(:email,~r/^(([^()[\]\\,;:\s@\“]+(\.[^()[\]\,;:\s@\“]+)*)(\“+\”)(\[[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[1,3}.]}.[1,3}.]
|>自定义(:金额)
结束
defp custom(%%{params:params}=changeset,field)何时是_-map(params)do
value=Map.get(params,param)
如果是素数(值)do
放置更改(更改集:提供,12)
结束
变更集
结束
defp自定义(变更集)do
变更集
结束
def是素数(x),do:(2..x |>Enum.filter(fna->rem(x,a)==0 end)|>length())==1
是一种不变的语言
也就是说,下面是noop。任何东西都不能变异(就地改变)
此代码返回并立即丢弃调用put\u change/3
的结果
要有条件地更改该值,应返回以下结果:
value = Map.get(params, param)
if is_prime(value),
do: put_change(changeset, :offer, 12),
else: changeset
旁注:您从未使用传递给
custom/2
的字段
,这让我觉得您想要的有点像:
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
您可以使用或从变更集中获取字段。前者只查看更改,后者首先查看更改,然后返回数据
所以你能做的是:
defp custom(changeset, field) do
value = get_change(field)
if is_prime(value) do
put_change(changeset, :offer, 12)
else
changeset
end
end
谢谢你的回答。也许我说得不够清楚,对不起,我是新手。我想得到:amount字段的值。它应该很简单,但我不能让它工作。这是我的主要问题,除了对语言理解不够外。我不确定我是否听懂了。若要在强制转换后访问变更集中的
amount
字段,可以执行changeset.params[“amount”]
(注意它必须是字符串)或changeset.changes[:amount]
,以在且仅当它已更改时获取它。我在Sidenote下发布的代码应该是现成的。如果没有,请提供一份MCVE,并公布您遇到的错误。ROFL。它比什么好?@AlekseiMatiushkin我认为使用get\u change
更惯用。
defp custom(changeset, field) do
value = get_change(field)
if is_prime(value) do
put_change(changeset, :offer, 12)
else
changeset
end
end