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

发布于 08-29 16:11 字数 402 浏览 5 评论 0原文

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

想删除容器中的所有 MyObjects 而不必删除 MyContainer。我的模型确实有 :dependent =>; :destroy,但是我不想删除并重新创建该对象,因为它速度较慢。

像这样的事情是行不通的:

@obj = MyContainer.find_by_id(10)
@obj.my_objects.delete_all

我怎样才能做到这一点?

I have

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

I want to delete all the MyObjects in the container without having to delete the MyContainer. My model does have :dependent => :destroy, however I don't want to have to delete and re-create the object because it is slower.

Something like this does not work:

@obj = MyContainer.find_by_id(10)
@obj.my_objects.delete_all

How can I accomplish this?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

白云不回头2024-09-05 16:11:48

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

您应该使用 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

delete_all is an ActiveRecord::Base class method.

You should use destroy_all. Something like:

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

Using delete_all properly would be faster if you don't need to lookup your MyContainer first (or use it for other stuff)

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

EDIT: for rails 3

MyObject.where(my_container_id: 10).delete_all
丑丑阿2024-09-05 16:11:48

其中一项或两项应该有效:

MyContainer.find(10).my_objects.destroy_all

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

One or both of these should work:

MyContainer.find(10).my_objects.destroy_all

MyContainer.find(10).my_objects.each(&:destroy)
追星践月2024-09-05 16:11:48

您可以直接删除对象,如下所示

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

You can delete objects directly like following

MyObject.delete_all(["my_container_id=?", 10])
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文