Каков наилучший способ предотвратить удаление последней записи в коллекции has_many? - PullRequest
3 голосов
/ 10 ноября 2010

У меня есть два класса 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.

Ответы [ 2 ]

2 голосов
/ 10 ноября 2010

Почему бы не использовать простую проверку учетной записи?

class Account < ActiveRecord::Base
  has_many :user_account_roles

  validate :at_least_one_user_account_role
  validate :at_least_one_administrator_role

  private
  def at_least_one_user_account_role
    if user_account_roles.size < 1
      errors.add_to_base('At least one role must be assigned.')
    end
  end

  def at_least_one_administrator_role
    if user_account_roles.none?(&:administrator?)
      errors.add_to_base('At least one administrator role must be assigned.')
    end
  end
end

Таким образом, ничего не нужно поднимать, и запись не будет сохранена, если не будет хотя бы одной роли и хотя бы одной роли администратора. Таким образом, при повторном рендеринге формы редактирования в случае ошибки это сообщение будет отображаться.

0 голосов
/ 10 ноября 2010

Вы можете разместить проверку на UserAccountRole.Если это единственное UserAccountRole, связанное с Учетной записью, его нельзя удалить.

Более простым решением может быть сомнение основополагающего предположения вашего дизайна.Почему UserAccountRole является моделью с поддержкой AR?Почему бы просто не сделать это обычным рубиновым классом?Собирается ли конечный пользователь динамически определять роли?Если нет, то вы можете значительно упростить свою дилемму, сделав ее обычным рубиновым классом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...