Actualizar registro en Elixir usando Ecto
Necesito actualizar la tabla 1 con una clave primaria de la tabla 2,
Tabla1 = Redisserver
Tabla2 = Userserver
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
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:
Este código recupera el servidor Redis
redis_server
junto con su usuario asociado conRepo.preload/2
. Luego crea un cambioset conEcto.Changeset.change/2
y asocia el campo:user
con el argumentouser
utilizandoEcto.Changeset.put_assoc/4
. Finalmente, actualiza el servidor en la base de datos llamando aRepo.update/2
.Este código asume que el esquema
RedisServer
tiene un campo de clave externa llamadouser_id
que referencia la clave primaria del esquemaUserServer
.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ónupdate_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.