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.

Actualizar registro en Elixir usando Ecto

Necesito actualizar la tabla 1 con una clave primaria de la tabla 2,

Tabla1 = Redisserver
Tabla2 = User
server

Código

def update_redis_server(redis_server, user) do

    params = %{"id" => redis_server.id, "user_id" => user.id }
    %RedisServer{}
    |> Repo.preload([:user])
    |> RedisServer.changeset(params)
    |> IO.inspect
    |> Repo.update()


  end

Texto de apoyo

1. Inspeccionar el conjunto de cambios
AAK.POS.HelperFunction.update_redis_server(redis_server, user)
#Ecto.Changeset<
  action: nil,
  changes: %{user_id: "3b7b8166-d474-410f-bf9f-c3910734e197"},
  errors: [],
  data: #AAK.Cache.RedisServer<>,
  valid?: true
>

Datos de muestra de la base de datos

id                                      server_url                   user_id
"685af94f-f794-4a77-9bb8-4a217b9fba1b"    "redis://localhost:59443/2"    nil    
"ec00e240-e91f-4835-a0f0-f9103fd39d3b"    "redis://localhost:6379/2"    nil 
"2b451a2c-c749-4ae2-9d19-5fec1c1bfee4"    "redis://localhost:59445/2"    nil    

Error

** (Ecto.NoPrimaryKeyValueError) falta el valor de la clave primaria en la estructura `%AAK.Cache.RedisServer{__meta__: #Ecto.Schema.Metadata<:built, "redis_servers">, id: nil, inserted_at: nil, server_url: nil, updated_at: nil, user: nil, user_id: nil}`
    (ecto 3.7.1) lib/ecto/repo/schema.ex:967: función anónima/3 en Ecto.Repo.Schema.add_pk_filter!/2
    (elixir 1.11.1) lib/enum.ex:2181: Enum."-reduce/3-lists^foldl/2-0-"/3
    (ecto 3.7.1) lib/ecto/repo/schema.ex:414: Ecto.Repo.Schema.do_update/4
Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para actualizar la Tabla 1 (Redis_server) con la clave primaria de la Tabla 2 (User_server) utilizando Elixir con Ecto, se puede usar el siguiente código:

    def update_redis_server(redis_server, user) do
      redis_server
      |> Repo.preload(:user)
      |> Ecto.Changeset.change()
      |> Ecto.Changeset.put_assoc(:user, user)
      |> Repo.update()
    end
    

    Este código recupera el servidor Redis redis_server junto con su usuario asociado con Repo.preload/2. Luego crea un cambioset con Ecto.Changeset.change/2 y asocia el campo :user con el argumento user utilizando Ecto.Changeset.put_assoc/4. Finalmente, actualiza el servidor en la base de datos llamando a Repo.update/2.

    Este código asume que el esquema RedisServer tiene un campo de clave externa llamado user_id que referencia la clave primaria del esquema UserServer.

    Si el código falla con un mensaje de error no primary key value, es probable que el servidor Redis %RedisServer{} pasado a la función update_redis_server/2 no tenga un valor de clave primaria. En este caso, el error se puede solucionar asegurándose de que el servidor pasado tenga un valor de clave primaria válido.

Comments are closed.