que tienen un modelo de cuenta y un modelo de usuario:Validar máxima cantidad af objetos asociados
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 de usuario tiene un máximo (diferente para cada cuenta). Pero, ¿cómo puedo validar que este máximo no se ha alcanzado al agregar nuevos usuarios a una cuenta?
principio traté de añadir una validación de la usuaria:
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 sólo funciona si estoy añadiendo un usuario a la vez.
Si agrego varios usuarios a través de @account.update_attributes(:users_attributes => ...)
, pasa directamente aunque solo haya espacio para un usuario más.
Actualización:
Solo para aclarar: El método de validación actual valida que account.users.count
es menor que account.maximum_amount_of_users
. Así que decir por ejemplo, que es account.users.count
9 y account.maximum_amount_of_users
es 10, entonces la validación pasará porque 9 < 10.
El problema es que el recuento de regresar de account.users.count
no aumentará hasta que todos los usuarios se han escrito en la base de datos. Esto significa que al agregar múltiples usuarios al mismo tiempo se pasarán las validaciones, ya que el conteo de usuarios será el mismo hasta que todos sean validados.
Así como askegg señala, ¿debería agregar la validación al modelo de Cuenta también? ¿Y cómo debería hacerse eso?
atributos_actualización ejecuta validaciones, al menos en Rails 2.3.2. Pero el problema es que el método de validación en el modelo de usuario valida que no se alcanza el máximo en comparación con la cantidad de usuarios que ya está en la cuenta. Es decir. si max == 10 y users.count == 9, entonces - al agregar dos usuarios al mismo tiempo - las validaciones se ejecutan para ambos, pero validando cada vez 9 <10. Dado que users.count no aumentará antes del los usuarios se escriben en la base de datos. Pero, ¿cómo se puede validar eso en el modelo de Cuenta? ¿Debo anular los atributos de actualización, etc.? –
Ahh - disculpe. Update_attribute (tenga en cuenta las "s" que faltan al final) pasa por alto las validaciones. Mi error. Parece que Ryan (que tiene mucho más Rubyfoo que yo) ha respondido a su pregunta. No sabía que el método de "tamaño" incluye registros no guardados. Aprendes algo cada día :) – askegg