Ao tentar validar a exclusividade em um tem e pertence a muitos, há um pequeno retorno de chamada que você pode usar para verificar manualmente:
Vamos usar um exemplo:
class Room < ActiveRecord::Base
has_and_belongs_to_many :people
end
class Person < ActiveRecord::Base
has_and_belongs_to_many :rooms
end
Se quisermos ter certeza de que uma sala não pode ter mais de 5 pessoas dentro dela, podemos fazer:
class Room < ActiveRecord::Base
has_and_belongs_to_many :people, before_add: :check_people_inside
def check_people_inside person
raise ActiveRecord::Rollback if people.count == 5
end
end
A reversão será capturada automaticamente para você e o novo registro não será adicionado à relação.
Você pode personalizar o validador, para adicionar mensagens de erro, para usar em formulários e similares.