Rails: Como limitar o número de itens na associação has_many (do pai)
Gostaria de limitar o número de itens em uma associação. Quero garantir que o Usuário não tenha mais do que X Things. Essa questão foi perguntado antes e a solução tinha a lógica na criança:
A solução oferecida (para problema semelhante):class User < ActiveRecord::Base
has_many :things, :dependent => :destroy
end
class Thing <ActiveRecord::Base
belongs_to :user
validate :thing_count_within_limit, :on => :create
def thing_count_within_limit
if self.user.things(:reload).count >= 5
errors.add(:base, "Exceeded thing limit")
end
end
end
O codificado "5" é um problema. Meu limite muda com base no pai. A coleção de Coisas conhece seu limite em relação a um Usuário. No nosso caso, um gerente pode ajustar o limite (de itens) para cada usuário, portanto, o usuário deve limitar sua coleção de itens. Nóspoderi peça que o número_de_informática solicite o limite ao seu usuário:
if self.user.things(:reload).count >= self.user.thing_limit
Mas isso é muitodo utilizado introspecção de coisa. Várias chamadas para o usuário e, especialmente, que(:reload)
são bandeiras vermelhas para mim.
Eu penseihas_many :things, :before_add => :limit_things
funcionaria, mas devemos abrir uma exceção para pare a corrente. Isso me obriga a atualizar o things_controller para lidar com exceções em vez da convenção de trilhos deif valid?
ouif save
.
class User
has_many :things, :before_add => limit_things
private
def limit_things
if things.size >= thing_limit
fail "Limited to #{thing_limit} things")
end
end
end
Este é o Rails. Se eu tiver que trabalhar duro, provavelmente estou fazendo algo erradPara fazer isso, tenho que atualizar o modelo pai, o controlador da criança, E não posso seguir a convenção? Estou esquecendo de algo? Estou usando malhas_many, :before_add
? Procurei um exemplo usando: before_add, mas não consegui encontrar nenhu
Pensei em mudar a validação para o Usuário, mas isso ocorre apenas no salvamento / atualização do Usuário. Não vejo uma maneira de usá-lo para impedir a adição de uma coisa.
Prefiro uma solução para o Rails 3 (se isso for importante para esse problema