Как мне каскадно удалять полиморфные ассоциации в активной записи?

Давайте возьмем этот случай в качестве примера:

class Child < ActiveRecord::Base
    belongs_to :fruitful, polymorphic: true
end

class Parent < ActiveRecord::Base
    has_many :children, as: :fruitful, dependent: :destroy
end

# Once I create the parent and children
p = Parent.create
p.children << Child.new
p.children << Child.new
p.save

# But deleting parent does not delete children:
p.destroy  # why not?

Возникает вопрос: "Зависимый:: уничтожить" не поддерживается с полиморфной ассоциацией активной записи, и мне нужно реализовать обратный вызов before_destroy, чтобы предотвратить потерянные записи?

2 ответа

Решение

Должно ли это быть belongs_to :parent?

Возможно, вам просто нужно позвонить parent.reload перед звонком parent.destroy так что он знает, что это детские идентификаторы. Когда вы делаете << Child.new Объект в памяти может не точно отражать данные.

Редактировать: Этот парень объясняет это лучше!

На практике я ожидаю, что вы обычно не будете уничтожать объект непосредственно после манипулирования его дочерними объектами, так что это скорее всего проблема консоли, и вам не нужно reload в вашем приложении.

Используйте уничтожение вместо удаления

:destroy, когда объект будет уничтожен, destroy будет вызван для связанных с ним объектов.:delete, когда объект уничтожен, все связанные с ним объекты будут удалены непосредственно из базы данных без вызова их метода уничтожения.

Если вам нужно удалить ребенка, а родитель тоже должен быть удален автоматически

используйте ниже

class Child < ActiveRecord::Base
belongs_to :fruitful, polymorphic: true , dependent: :destroy
Другие вопросы по тегам