DELETE FROM表WHERE myfield = 1(ActiveRecord)

时间:2013-01-13 18:25:30

标签: ruby-on-rails

我在弄清楚如何快速销毁数千条记录时遇到了问题。

我有一个名为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的所有Views的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

很奇怪我在任何地方都找不到这样的东西。

1 个答案:

答案 0 :(得分:3)

您可以执行以下操作:

private
def destroy_children
  pictures.destroy_all
  Ad.delete_all(:item_id => self.id)
  Post.delete_all(:item_id => self.id)
  View.delete_all(:item_id => self.id)
end

您可以阅读有关delete_all here的更多信息,请注意,delete_alldelete不会调用任何回调before_destroy或{{1} },他们也会忽略任何after_destroy规则。