validar validaciones relaciones rails polimorficas formulario asociaciones ruby-on-rails ruby activerecord

ruby on rails - validaciones - ¿La mejor práctica para limitar el número de asociaciones dentro de una relación has_many?



validaciones rails (2)

Al principio, si su tabla de usuarios tiene una clave foránea account_id, entonces necesita usar

class User belongs_to :account end

De esta forma, se asegurará de que el usuario pueda asociarse solo a una cuenta.

Si desea limitar esa cuenta puede tener, por ejemplo, como máximo 3 usuarios, entonces puede definir la siguiente validación:

class User validates_each :account do |user, attr, value| user.errors.add attr, "too much users for account" if user.account.users.size >= 3 end end

y como resultado, no podrá crear un nuevo usuario para la cuenta si la cuenta ya tiene 3 usuarios.

Diga que tengo dos modelos: usuarios y cuentas. Cada cuenta puede tener como máximo n usuarios asociados a ella, y un usuario solo puede asociarse con una cuenta.

Parecería natural decir que el usuario

belongs_to :account

y cuenta

has_many :users

Sin embargo, no tengo claro cuál es la mejor práctica cuando se trata de limitar el número de asociaciones a través de esa declaración de has_many. Sé que hay un argumento: límite, pero eso solo limita el número de asociaciones devueltas, no el número que puede existir.

Sospecho que la respuesta es usar algo como: before_add. Sin embargo, ese enfoque parece aplicarse únicamente a las asociaciones creadas a través de <<. Entonces se llamaría cuando usaste

@account.users << someuser

pero no si usabas

@account.users.create

También consideré que podría ser más práctico implementar el límite usando before_save dentro del modelo de Usuario, pero parece que sería un poco desacertado implementar las reglas de negocio de la Cuenta dentro del modelo de Usuario.

¿Cuál es la mejor práctica para limitar el número de asociaciones?

Editar: los n usuarios por cuenta serían algunos datos comerciales que se almacenan dentro de las cuentas individuales, en lugar de ser un número mágico directo que estaría flotando de cualquier forma en el código.


Creo que su regla está sujeta a una interpretación diferente. Piense en la regla como "No puede agregar un usuario a una cuenta que ya tiene 3 usuarios". Ahora que se trata de una regla de usuario, su implementación en el objeto de usuario parece perfectamente natural y la solución de @ Raimond será suficiente.

También podría pensar en implementar esto como una restricción de la base de datos, pero probablemente no vaya por ese camino ... 3 parece ser un número arbitrario que puede cambiar más adelante y yo, y sospecho que usted, preferiría que se capturara en el código en lugar de oculto en una restricción DB.