我在Rails 4.2.3应用程序中有Product
has_many
ProductAttributes
模型。
Product
有时可以有超过10,000个ProducAttribute。
我需要删除其中一些产品,但是当我在产品上调用destroy
时,需要花费非常长的时间。看起来它从ProductAttribute
获取了一个id列表,然后逐个称为delete。
但是当它结束时,它只是悬而未决。我有很多要删除的数据,偶尔我需要这样做。
但我不能永远把这件事挂起来。最后我必须做Ctrl-C
,之后我发现Rollback
正在发生。
我的问题是,它到底在做什么?为什么我不能可靠地从应用层中删除大量数据?
答案 0 :(得分:3)
我怀疑你使用类似
的东西has_many :product_attributes, dependent: :destroy
您可能希望查看使用dependent: :delete
,以便Rails在单独销毁之前不会实例化所有相关记录。
documentation将有更多关于后果的信息(例如,如果在依赖模型上执行回调等)。
答案 1 :(得分:2)
destroy
的更快替代方法是delete
,但这不会追逐并销毁任何依赖关系,也不会触发任何before_destroy
或after_destroy
挂钩。
如果要销毁多条记录,请使用delete_all
代替destroy_all
。
ProductAttribute.delete_all(:id => ids)
如果您真的关心速度,请使用delete
。