销毁一些记录需要非常长的时间

时间:2015-07-23 20:32:19

标签: ruby-on-rails postgresql activerecord rails-activerecord

我在Rails 4.2.3应用程序中有Product has_many ProductAttributes模型。

Product有时可以有超过10,000个ProducAttribute。

我需要删除其中一些产品,但是当我在产品上调用destroy时,需要花费非常长的时间。看起来它从ProductAttribute获取了一个id列表,然后逐个称为delete。

但是当它结束时,它只是悬而未决。我有很多要删除的数据,偶尔我需要这样做。

但我不能永远把这件事挂起来。最后我必须做Ctrl-C,之后我发现Rollback正在发生。

我的问题是,它到底在做什么?为什么我不能可靠地从应用层中删除大量数据?

2 个答案:

答案 0 :(得分:3)

我怀疑你使用类似

的东西
has_many :product_attributes, dependent: :destroy

您可能希望查看使用dependent: :delete,以便Rails在单独销毁之前不会实例化所有相关记录。

documentation将有更多关于后果的信息(例如,如果在依赖模型上执行回调等)。

答案 1 :(得分:2)

destroy的更快替代方法是delete,但这不会追逐并销毁任何依赖关系,也不会触发任何before_destroyafter_destroy挂钩。

如果要销毁多条记录,请使用delete_all代替destroy_all

ProductAttribute.delete_all(:id => ids)

如果您真的关心速度,请使用delete