Validar quantidade máxima de objetos associados
Eu tenho um modelo de conta e um modelo de usuário:
class Account < ActiveRecord::Base
has_many :users
end
class User < ActiveRecord::Base
belongs_to :account
end
Os usuários pertencem a uma conta e uma conta a um usuário máximo (diferente para cada conta). Mas como eu confirmo que esse máximo não foi atingido ao adicionar novos usuários a uma conta?
Primeiro eu tentei adicionar uma validação no usuário:
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
Mas isso só funciona se eu estou adicionando um usuário por vez.
Se eu adicionar vários usuários via@account.update_attributes(:users_attributes => ...)
apenas passa diretamente, mesmo que haja apenas espaço para mais um usuário.
Atualizar:
Apenas para esclarecer: O método de validação atual valida queaccount.users.count
é menos do queaccount.maximum_amount_of_users
. Então diga, por exemplo, queaccount.users.count
é 9 eaccount.maximum_amount_of_users
é 10, então a validação passará porque 9 <10.
O problema é que a contagem retornouaccount.users.count
não aumentará até que todos os usuários tenham sido gravados no banco de dados. Isso significa que adicionar vários usuários ao mesmo tempo passará validações, pois a contagem de usuários será a mesma até que todos sejam validados.
Assim comoaskegg aponta, devo adicionar validação ao modelo de conta também? E como isso deve ser feito?