Подтвердить что ты не робот

Rails - AciveRecord use: dependent =>: уничтожить при условии

Что будет лучшим/сухим способом уничтожить всех зависимых объектов на основе состояния.

Пример:

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 в зависимом состоянии. Я нашел методы для уничтожения иждивенцев по отдельности, но это не СУХИЕ и гибкие для дальнейших ассоциаций,

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

4b9b3361

Ответ 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 

Ответ 2

Этот другой способ позволяет сохранить ваши предложения dependent:

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

  def destroy
    ActiveRecord::Base.transaction do
      if self.is_fired?
        self.jobs.destroy_all
        self.coworkers.destroy_all
        self.company_credit_cards.destroy_all
      end
      super
    end
  end
end