Rails — AciveRecord использует: зависимый =>: уничтожить при условии

#ruby-on-rails #ruby #activerecord #destroy

#ruby-on-rails #ruby #activerecord #уничтожить

Вопрос:

Какой будет наилучший / СУХОЙ способ уничтожить все зависимые элементы объекта на основе условия. ?

Пример:

 class Worker < ActiveRecord::Base
 has_many :jobs , :dependent => :destroy
 has_many :coworkers , :dependent => :destroy
 has_many :company_credit_cards, :dependent => :destroy
end 
  

условием будет
при уничтожении:

 if self.is_fired? 
 #Destroy dependants records
else
 # Do not Destroy records
end 
  

Есть ли способ использовать Proc в :зависимом условии.
Я нашел методы для уничтожения зависимых элементов по отдельности, но это не является сухим и гибким для дальнейших ассоциаций,

Примечание: Я составил пример.. не является реальной логикой

Ответ №1:

Нет. Вы должны удалить :dependent => :destroy и добавить after_destroy обратный вызов, где вы можете написать любую логику, которую вы хотите.

 class Worker < ActiveRecord::Base
  has_many :jobs
  has_many :coworkers
  has_many :company_credit_cards
  after_destroy :cleanup

  private
  def cleanup
    if self.is_fired?
      self.jobs.destroy_all
      self.coworkers.destroy_all
      self.company_credit_cards.destroy_all
    end
  end
end 
  

Комментарии:

1. Просто будьте осторожны с обратными вызовами, поскольку они отлично работают, если только вы не обрабатываете слишком большие данные, где эти обратные вызовы создали бы для вас большую проблему с производительностью. Решением может быть «массовое удаление`, которое не поддерживается в rails для ассоциаций, поэтому вам нужно будет написать некоторый код

2. Что означает .is_fired? метод делает? Кажется, я не могу найти его где-либо еще.