我在弄清楚如何快速销毁数千条记录时遇到了问题。
我有一个名为 ITEM 的模型。它:
has_many :pictures (up_to 20)
has_many :ads (up to 10)
has_many :views (up_to 5000-8000)
has_many :posts (up to 100-200)
当用户销毁他的项目时 - 所有孩子也需要离开。
所以我尝试了我能找到的一切,但所有解决方案都基于 ID 进行查询:
:dependant => :destroy // makes a query per each item
***
before_destroy :destroy_children
private
def destroy_children
pictures.delete_all
ads.destroy_all
views.destroy_all
posts.destroy_all
end
// same
我目前的解决方案如下所示:
class Item << ActiveRecord:Base
has_many :pictures, :dependent => :destroy
before_destroy :destroy_children
private
def destroy_children
pictures.destroy_all
Ad.delete(self.ads.collect{|x| x.id})
Post.delete(self.ads.collect{|x| x.id})
View.delete(self.ads.collect{|x| x.id})
end
end
基本上,它获取属于 item 的所有 View 的 ID 数组,然后生成一个大的 IN 语句,如下所示:
DELETE FROM Views WHERE id IN (2, 3, 6, 8, 35, 50...)
如果我的 IN 数组有几千个 ID,这仍然太重了。
有没有办法生成这个查询?
DELETE FROM Views WHERE item_id = 4
也许是这样的?
View.delete(:item_id => 2)
// it doesn't work, but maybe something like this exists
奇怪的是我在任何地方都找不到这样的东西。