【发布时间】:2022-01-15 00:38:42
【问题描述】:
我对 Elixir/Ecto 很陌生,与其他语言不同,我发现控制流的工作方式有点令人困惑
我只想在Repo.exists?() 返回 false 时做一些事情。根据文档,这将返回一个布尔值。我试过了
**/Orginal OP code**
alias App.MyModule
params.id
|> MyModule.check_if_person_exist()
|> Repo.exists?()
|> if false do
IO.puts("\n\nFALSEEE\n\n")
MySchema
|> MySchema.changeset(%{data: data})
|> Repo.insert_or_update()
...
...
App.MyModule file
def check_if_person_exist(id) do
from(s in Schema
where id = ^id,
select %{
person: s.person
}
)
end
case do
false ->
//do stuff
但我收到一条错误消息,提示 no case clause matching true
我只想在错误的情况下做某事,而不是检查是否为真。这不能用 Ecto/Elixir 做吗?
//**MyQuery.Module**
def myqueryfunc(id) do
query = from(s in Schema
where id = ^id,
select %{
person: s.person
}
)
end
//**Some other file**
alias MyQuery.Module
query = Module.myqueryfunc(id)
case Repo.one(query) do
false ->
MySchema
|> MySchema.changeset(%{data: data})
|> Repo.insert_or_update()
我必须考虑true吗?
我只关心它是否是假的。
如果我必须处理 true,当它是 true 时,我能做什么什么都不做?
这行得通吗
query
|>Repo.exists?()
|> false
|> if(do: //insert or update)
【问题讨论】:
-
如果您对相反的条件感兴趣,而不是
if/2,您可能对unless/2感兴趣。您可以像query |> Repo.exists?() |> unless do .. end一样直接通过管道传输它。和|> Kernel.!() |> if基本一样