Rails,使用:has_many删除子项而不删除父项

8

我有

class MyContainer < ActiveRecord::Base
  :has_many MyObjects, :dependent => :destroy
end

我希望能够在不必删除MyContainer的情况下删除容器中的所有MyObjects。虽然我的模型中有:dependent => :destroy,但我不想删除并重新创建对象,因为这样会更慢。以下内容是无效的:
@obj = MyContainer.find_by_id(10)
@obj.my_objects.delete_all

我该如何实现这个目标?
3个回答

28

delete_all是一个ActiveRecord::Base类方法。

你应该使用destroy_all。类似这样:

@container = MyContainer.find_by_id(10)
@container.my_objects.destroy_all

如果您不需要首先查找您的MyContainer(或将其用于其他操作),则正确使用delete_all会更快。

MyObject.delete_all(["my_container_id = ?", 10])

编辑:适用于Rails 3

MyObject.where(my_container_id: 10).delete_all

0

以下两种方法都可以:

MyContainer.find(10).my_objects.destroy_all

MyContainer.find(10).my_objects.each(&:destroy)

使用后者的话,解决方案会将每个对象加载到内存中,速度会很慢。可能应该选择第一个解决方案。 - Kosmonaut
两者都会将每个对象实例化到内存中。 - Barry Kelly

0

你可以像下面这样直接删除对象

MyObject.delete_all(["my_container_id=?", 10])

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接