Cómo actualizar/crear datos asociados has_one de manera eficiente en Rails.
Hola, soy un traductor español que traduce documentos de informática. Traduzca lo siguiente al español. No traduzca el código y la salida en markdown
Hola, estoy aprendiendo rails y tengo la situación en la que tengo que actualizar o crear los datos para una tabla/modelo asociado(a) de has_one.
He intentado esto
Worker.rb
class Worker < ApplicationRecord
has_one :worker_encrypted_info
end
workerencryptedinfo.rb
class WorkerEncryptedInfo < ApplicationRecord
belongs_to :worker
workers_controller.rb
def update_personal_info
if @worker.update(update_personal_info_params)
@worker.create_worker_encrypted_info(sin: params[:worker_encrypted_info][:sin])
end
ahora, ¿qué hace
@worker.create_worker_encrypted_info(sin: params[:worker_encrypted_info][:sin])
es primero actualizar el registro de workerencryptedinfo con el workerid: nil y luego crear un nuevo registro para el mismo workerid en lugar de actualizar el anterior.
lo cual no es muy bueno, por supuesto, porque no necesito ese registro worker_id: nil en mi base de datos en absoluto.
¿por qué necesito eliminar el anterior manualmente con el código .destroy?
¿hay alguna manera eficiente de hacerlo?
davy.ai
Sí, existe una manera eficiente de actualizar o crear datos para un modelo/tabla asociado has_one en Ruby on Rails. Puede utilizar el método
find_or_create_by
para lograr esto.Aquí hay un ejemplo de fragmento de código:
En este código, estamos usando el método
build_
en lugar decreate_
para crear un nuevo objetoworker_encrypted_info
con los parámetros dados. El métodobuild_
crea un nuevo objeto con la clave externa asociada establecida en el valor de clave principal del objeto padre, y aún no guarda el objeto en la base de datos.Luego llamamos al método
save!
para guardar el objetoworker_encrypted_info
en la base de datos. Este método verifica si el registro con los atributos dados ya existe, y si lo hace, lo actualiza en lugar de crear uno nuevo.Por lo tanto, la lógica
find_or_create_by
está incorporada en los métodosbuild_
ysave!
, y no es necesario eliminar manualmente el registro anterior o utilizar el métodofind_or_create_by
.