Validar cantidad máxima de objetos asociados.
Tengo un modelo de cuenta y un modelo de usuario:
class Account < ActiveRecord::Base
has_many :users
end
class User < ActiveRecord::Base
belongs_to :account
end
Los usuarios pertenecen a una cuenta y una cuenta tiene un máximo de usuario (diferente para cada cuenta). Pero, ¿cómo validar que no se haya alcanzado este máximo al agregar nuevos usuarios a una cuenta?
Primero intenté agregar una validación al usuario:
class User < ActiveRecord::Base
belongs_to :account
validate :validate_max_users_have_not_been_reached
def validate_max_users_have_not_been_reached
return unless account_id_changed? # nothing to validate
errors.add_to_base("can not be added to this account since its user maximum have been reached") unless account.users.count < account.maximum_amount_of_users
end
end
Pero esto solo funciona si estoy agregando un usuario a la vez.
Si agrego múltiples usuarios a través de@account.update_attributes(:users_attributes => ...)
simplemente pasa directamente incluso si solo hay espacio para un usuario más.
Actualizar:
Solo para aclarar: el método de validación actual valida queaccount.users.count
es menos queaccount.maximum_amount_of_users
. Así que digamos por ejemplo queaccount.users.count
es 9 yaccount.maximum_amount_of_users
es 10, entonces la validación pasará porque 9 <10.
El problema es que el recuento devuelto desdeaccount.users.count
no aumentará hasta que todos los usuarios hayan sido escritos en la base de datos. Esto significa que agregar varios usuarios al mismo tiempo pasará las validaciones, ya que el recuento de usuarios será el mismo hasta que todos estén validados.
Así comopreguntando señala, ¿debería agregar validación al modelo de cuenta también? ¿Y cómo se debe hacer eso?