es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Ecto Repo.exists?() haz algo solamente cuando sea falso.

Soy bastante nuevo en Elixir/Ecto y, a diferencia de otros lenguajes, encuentro un poco confuso cómo funcionan los flujos de control.
Solo quiero hacer algo cuando Repo.exists?() devuelve falso. Según la documentación, esto devuelve un booleano. Intenté lo siguiente:

# Código original del OP
alias App.MyModule

params.id
    |> MyModule.check_if_person_exist()
    |> Repo.exists?()
    |> case false do
      true ->
        # hacer algo si es verdadero
      false ->
        IO.puts("\n\nFALSEEE\n\n")
        MySchema
        |> MySchema.changeset(%{data: data})
        |> Repo.insert_or_update()
    end

...
...
# Archivo App.MyModule

def check_if_person_exist(id) do
  from(s in Schema,
    where: id == ^id,
    select: %{person: s.person}
  )
end

Pero obtengo un error que dice no case clause matching true.

Solo quiero hacer algo si es falso y no comprobar si es verdadero. ¿No es posible hacer eso con Ecto/Elixir?

// Módulo MyQuery.Module
def myqueryfunc(id) do
  query = from(s in Schema,
    where: id == ^id,
    select: %{person: s.person}
  )
end
// Otro archivo

alias MyQuery.Module

query = Module.myqueryfunc(id)

case Repo.one(query) do
  false ->
    MySchema
    |> MySchema.changeset(%{data: data})
    |> Repo.insert_or_update()
  _ ->
    # hacer algo si es verdadero
end

¿Debo tener en cuenta el caso de que sea verdadero?

Solo me importa si es falso.

Si tengo que manejar el caso de que sea verdadero, ¿qué puedo hacer para no hacer nada cuando sea verdadero?

¿Funcionará esto?

query
|> Repo.exists?()
|> case do
  false ->
    # hacer algo si es falso
  true ->
    # no hacer nada si es verdadero
end
Tags:  ,

Answer

  1. Avatar for davy.ai

    Parece que estás intentando utilizar una declaración de caso con un valor booleano, pero así no funcionan las declaraciones de caso en Elixir. En su lugar, puedes utilizar una declaración if con el valor booleano negado:

    query = MyQuery.Module.myqueryfunc(id)
    
    if !Repo.exists?(query) do
      MySchema
      |> MySchema.changeset(%{data: data})
      |> Repo.insert_or_update()
    end
    

    En este código, utilizamos Repo.exists?/1 para verificar si la consulta devuelve algún resultado. Si devuelve falso, ejecutamos el bloque dentro de la declaración if. Si devuelve verdadero, no hacemos nada. El operador ! niega el valor booleano del resultado de la función, por lo que la declaración if solo se ejecuta si el valor es falso.

    Ten en cuenta que Repo.exists?/1 devuelve un valor booleano, por lo que no puedes utilizar el operador pipe para pasar el resultado a falso. En cambio, puedes utilizar la declaración if como se muestra arriba.

Comments are closed.