Validando exclusividade em associações HABTM

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.