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

#ruby-on-rails #destroy

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

Вопрос:

Учитывая модель продукта, которая имеет много цветов

 class Product < ApplicationRecord
    has_many :colors, dependent: :destroy
end
 

и цветовая модель, принадлежащая продукту, с after_destroy помощью которой уничтожается продукт, если у него больше нет цветов.

 class Color < ApplicationRecord
  belongs_to :product

  after_destroy do |color|
    product = color.product
    product.destroy! if product.colors.count.zero?
  end
end
 

Когда я уничтожаю цвет или даже все цвета, все работает хорошо.
Но когда я пытаюсь уничтожить продукт, он вызывает: ActiveRecord::RecordNotDestroyed (Failed to destroy the record)

в этой строке внутри цветовой модели: product.destroy! if product.colors.count.zero?

После небольшого теста я думаю, что это связано с тем круговым уничтожением, которое создается между продуктом и цветами. Есть ли способ определить, уничтожается ли объект Color зависимостью «has_many» или нет?

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

1. вы можете попытаться проверить, если product.marked_for_destruction?

Ответ №1:

Для ассоциаций определены 4 обратных вызова (before_add, after_add, before_remove и after_remove). Вы, вероятно, хотите after_remove:

 class Product < ApplicationRecord
  has_many :colors, dependent: :destroy, after_remove: :cleanup_product

  def cleanup_product(color)
    color.product.destroy if color.product.colors.empty?
  end
end