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.

Tratando con asociaciones has_one y has_many en un único modelo de usuario.

Actualmente tengo un modelo de Usuario

class User < ApplicationRecord
  has_one :leases
end

un modelo de Arrendamiento

class Lease < ApplicationRecord<br>
  belongs_to :tenant, class_name: 'User'
  belongs_to :landlord, class_name: 'User'
end

y un modelo de Alquiler

class Rental < ApplicationRecord
  has_one :lease, dependent: :destroy
end

y solo tengo un modelo de usuario compatible con inquilinos y propietarios.

El problema al que me enfrento es que un propietario puede tener varios arrendamientos con muchos inquilinos diferentes, pero los inquilinos solo pueden tener un arrendamiento a la vez.

Estoy un poco confundido sobre cómo debo estructurar esto correctamente. ¿Debería tener una relación “tiene_muchos” con el modelo de Usuario y el modelo de Arrendamiento en lugar de “tiene_uno” y luego solo un método llamado “arrendamiento” en el modelo de Usuario para obtener el arrendamiento de un inquilino?
Lo que me gustaría tener es algo como

inquilino.arrendamiento

y

propietario.arrendamientos

¿Podría simplemente hacer esto?

class User < ApplicationRecord
  has_one :arrendamiento, foreign_key: "tenant_id"
  has_many :arrendamientos, foreign_key: "landlord_id"
end

esto parece funcionar, pero no estoy seguro si es la forma correcta de hacerlo.

Tags:  ,

Answer

  1. Avatar for davy.ai

    Para admitir el escenario en el que un arrendador puede tener varios contratos de alquiler con diferentes inquilinos y los inquilinos solo pueden tener un contrato de alquiler a la vez, puede modificar la asociación entre los modelos Usuario y Contrato de alquiler de la siguiente manera:

    class User < ApplicationRecord
      has_many :leases_as_landlord, class_name: 'Lease', foreign_key: 'landlord_id'
      has_one :lease_as_tenant, class_name: 'Lease', foreign_key: 'tenant_id'
    end
    

    Esto le permitirá acceder a los contratos de alquiler de un arrendador de la siguiente manera:

    arrendador = User.first
    arrendador.leases_as_landlord # Devuelve todos los contratos de alquiler en los que el arrendador es el propietario
    

    Para obtener el contrato de alquiler de un inquilino, puede usar:

    inquilino = User.second
    inquilino.lease_as_tenant # Devuelve el contrato de alquiler actual para el inquilino
    

    Esto le dará la salida deseada de arrendador.leases e inquilino.lease.

    Al establecer la opción foreign_key en las asociaciones, puede especificar el nombre de la columna a utilizar al buscar las asociaciones.

    Tenga en cuenta que no es necesario modificar el modelo de Alquiler ya que no se ve afectado por los cambios en los modelos de Usuario y Contrato de alquiler.

Comments are closed.