Как мне каскадно удалять полиморфные ассоциации в активной записи?
Давайте возьмем этот случай в качестве примера:
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