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.

Validación única con alcance para la asociación has_many.

Mi hotel tiene muchos usuarios y los usuarios pueden pertenecer a muchos hoteles. Quiero tener una validación de ámbito, es decir, validar la unicidad del nombre de usuario y el correo electrónico del usuario por hotel. Actualmente, mis modelos se ven así:

class User < ApplicationRecord
  has_many :hotel_users
  has_many :hotels, through: :hotel_users
end

y mi modelo de hotel:

class Hotel < ApplicationRecord
  has_many :hotel_users
  has_many :users, through: :hotel_users
end

¿Alguna sugerencia?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para lograr la validación del alcance para la unicidad del nombre de usuario y el correo electrónico del usuario por hotel, puedes utilizar la validación de uniqueness junto con la opción de scope. La opción de scope te permite especificar uno o más atributos que se deben usar para limitar el alcance de la validación.

    Aquí tienes un ejemplo de cómo puedes implementar esto en tu modelo de User:

    class User < ApplicationRecord
      has_many :hotel_users
      has_many :hotels, through: :hotel_users
    
      validates :username, uniqueness: { scope: :hotel_id }
      validates :email, uniqueness: { scope: :hotel_id }
    end
    

    En este ejemplo, la validación de uniqueness se aplica tanto a los atributos de username como de email, y la opción de scope se establece en :hotel_id. Esto significa que la validación solo se aplicará a usuarios dentro de un hotel específico, determinado por su hotel_id.

    Ten en cuenta que deberás actualizar tu modelo de HotelUser para incluir el atributo de hotel_id:

    class HotelUser < ApplicationRecord
      belongs_to :hotel
      belongs_to :user
    
      # añadir atributo de hotel_id
      validates :user_id, uniqueness: { scope: :hotel_id }
    end
    

    Con estos cambios, puedes asegurarte de que el nombre de usuario y el correo electrónico de cada usuario sean únicos dentro del alcance de un hotel específico.

Comments are closed.