У меня есть два класса ActiveRecord. Упрощенный вид этих классов:
class Account < ActiveRecord::Base
has_many :user_account_roles
end
class UserAccountRole < ActiveRecord::Base
belongs_to :account
# Has a boolean attribute called 'administrator'.
end
То, с чем я борюсь, это то, что я хотел бы иметь возможность применить два правила проверки к этому:
* Обеспечение невозможности удаления последнего UserAccountRole.
* Обеспечение невозможности удаления последнего UserAccountRole, являющегося администратором.
Я действительно изо всех сил пытаюсь понять лучший способ достижения такого рода структурной проверки. Я попытался добавить обратный вызов before_remove к ассоциации, но мне не нравится, что это приводит к ошибке, которая должна быть перехвачена контроллером. Я бы предпочел, чтобы это воспринималось как «просто еще одна проверка».
class Account < ActiveRecord::Base
has_many :user_account_roles, :before_remove => check_remove_role_ok
def check_remove_relationship_ok(relationship)
if self.user_account_relationships.size == 1
errors[:base] << "Cannot remove the last user from this account."
raise RuntimeError, "Cannot remove the last user from this account."
end
end
end
Я не думаю, это имеет какое-то значение, но я также использую accepts_nested_attributes_for.