Пропустить проверку зависимости:: destroy - PullRequest
0 голосов
/ 25 ноября 2018

У меня есть пользователь и модель компании, как показано ниже.Модель компании имеет несколько проверок.

user.rb

    after_create :create_tables!

    def create_tables!
      companies.create!(handle: "random_handle")
   end

company.rb

before_destroy :check_for_presence_of_a_company!

def check_for_presence_of_a_company!
  if user.companies.count <= 1
    errors.add(:base, 'You cannot delete all of your companies.')
    throw(:abort)
  end
end

когда пользовательсоздает учетную запись в первый раз, когда я создаю для него компанию, используя after_create в модели пользователя и перед удалением компании он должен иметь хотя бы одну компанию.

Но проблема заключается в том, что пользователь пытается удалитьВ его аккаунте вышеприведенная валидация компании выдает ошибку.

Когда пользователь удаляет свою учетную запись, он должен пренебречь вышеуказанной проверкой company.rb .Как я могу достичь этого?Спасибо.

Редактировать

В user.rb я обновил

has_many :companies,dependent: :destroy

до

has_many :companies,dependent: :delete_all

Но company.rb

has_many :categories, dependent: :destroy

и показывает нарушает ограничение внешнего ключа ошибка.Обновление его с уничтожения на delete_all также не работает.

Ответы [ 2 ]

0 голосов
/ 27 ноября 2018

Полагаю, у вас есть (хотя вы этого не показывали):

class User
  has_many :companies, dependent: :destroy
end

Если это так, вы можете изменить :destroy на :delete_all:

has_many :companies, dependent: :delete_all

За https://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html#method-i-has_many:

:delete_all происходит удаление всех связанных объектов непосредственно из базы данных (поэтому обратные вызовы не будут выполняться).

(примечание с момента обратных вызовов)на Company не будет запускаться, если вам нужно удалить дополнительные ассоциации, вам придется обрабатывать их отдельно.)

0 голосов
/ 25 ноября 2018

Вместо использования dependent: :destroy вы можете добавить after_destroy обратный вызов и вызов delete или delete_all (который не запускает проверки).

# user.rb

after_destroy :delete_companies

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