Когда вы говорите «чтобы дети удалялись, когда родитель удалялся?», Вы можете привести пример? То есть когда проект удален, я хочу, чтобы все его сообщения тоже были удалены? Что происходит, когда вы удаляете сообщение, хотите ли вы удалить что-либо еще (например, все соответствующие записи message_consumer)?
UPDATE
ОК, поэтому has_many_polymorphs
автоматически удалит «осиротевшие» message_consumer
с. Ваша проблема в том, что сообщение может иметь более одного потребителя, поэтому удаление проекта может быть недостаточным основанием для удаления всех связанных с ним сообщений (поскольку другие потребители могут зависеть от этих сообщений).
В этом конкретном случае вы можете настроить обратный вызов after_destroy
в MessageConsumer
, чтобы проверить, существуют ли еще другие MessageConsumer
отображения (кроме себя), которые ссылаются на Message
, и, если таковые не существуют, также удалите сообщение, например:
class MessageConsumer < ActiveRecord::Base
...
after_destroy :delete_orphaned_messages
def delete_orphaned_messages
if MessageConsumer.find(:first, :conditions => [ 'comment_id = ?', self.comment_id] ).empty?
self.comment.delete
end
end
end
Все это происходит внутри транзакции, поэтому либо все операции удаются, либо ни одна не удалась.
Вам следует знать только о возможных условиях гонки, при которых один сеанс может прийти к выводу, что Message
больше не используется, тогда как другой может находиться в процессе создания нового MessageConsumer
для того же самого Message
. Это может быть обеспечено ссылочной целостностью на уровне БД (добавьте ограничения внешнего ключа, которые приведут к сбою двух сеансов и сохранят вашу базу данных в согласованном состоянии) или блокировкой (тьфу!)