2016-06-16 3 views
1

Мои моделиRails проверить количество ассоциаций перед удалением

class Company 
    has_many :admins 

    validate :has_one_admin_validation 

    private 

    def has_one_admin_validation 
    errors.add(:admins, :not_enough) if admins.size < 1 
    end 

end 

class Admin 
    belong_to :company 
end 

Теперь предположим, что у меня есть контроллер, который может удалить админов. Как предотвратить удаление администратора (т. Е. Сгенерировать ошибки), если он является единственным администратором своей компании?

Если я хорошо понимаю, мне нужно удалить администратор из объекта памяти и попытаться «сохранить/уничтожить», если сначала подтвердить компанию?

+0

извещение есть [validates_associated] (http://api.rubyonrails.org/classes/ActiveRecord/Validations/ClassMethods.html) – niceman

+0

хмм, но, возможно, это проверка относится к классу администратора, не уверен, хотя – niceman

ответ

2

Я не думаю, что вам нужна специальная проверка вообще на модели компании. Вы можете использовать проверку длины для своей ассоциации.

validates :admins, length: { minimum: 1 } 

Если это не работает, вы должны также быть в состоянии проверить "marked_for_destruction? имущество. Вы также должны иметь возможность проверять взаимные отношения с валидацией «наличие: истина».

class Company 
     has_many :admins 

     validate :has_one_admin_validation 

     private 

     def has_one_admin_validation 
      errors.add :admins, "You need at least one admin" if admins.reject(&:marked_for_destruction?).empty? 
     end 

    end 

    class Admin 
     belongs_to :company, presence: true 
    end 

Возможно, вы также захотите использовать обратный вызов before_destroy в своем классе администратора.

before_destroy :has_company_with_no_other_admins 
     ... 

     private 

     def has_company_with_no_other_admins 
      return false if company.admins.length < 2 
      true 
     end 

Там довольно хорошее описание использования before_destroy здесь: https://stackoverflow.com/a/123190/6441528 Это стоит посмотреть, потому что реализация зависит от вашей версии Rails.

+1

Хммм будет эта проверка запустить в Admin удалить? обратите внимание, что проверка присутствует в классе категории или может быть помещена в класс администратора? – niceman

+0

Привет! Я не ОП, но у меня есть проект, где я могу использовать что-то вроде этого. Скажите, что у меня есть модель с ассоциированной с has_one моделью, поможет ли это мне ограничить 1 ассоциацию для этой модели? Приветствия и спасибо! –

+0

@AlfredoGallegos 'has_one' достаточно, нет необходимости в проверке, на самом деле добавление более 1 приведет к исключению среды выполнения Ruby (возможно, NoMethodError) – niceman