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.

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?

Tags:  , , ,

Answer

  1. Avatar for 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:

    def update_personal_info
      if @worker.update(update_personal_info_params)
        @worker.build_worker_encrypted_info(sin: params[:worker_encrypted_info][:sin]).save!
      end
    end
    

    En este código, estamos usando el método build_ en lugar de create_ para crear un nuevo objeto worker_encrypted_info con los parámetros dados. El método build_ 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 objeto worker_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étodos build_ y save!, y no es necesario eliminar manualmente el registro anterior o utilizar el método find_or_create_by.

Comments are closed.