#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