Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Elixir 如何获取变更集字段的值_Elixir_Phoenix Framework - Fatal编程技术网

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