2013-01-13 49 views
0

我在解決如何快速銷燬數千條記錄的問題。DELETE FROM table WHERE myfield = 1(ActiveRecord)

我有一個名爲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 

基本上,它獲取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 

很奇怪,我在任何地方都找不到這樣的東西。

回答

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_allhere,記住,delete_alldelete不調用任何回調before_destroyafter_destroy,他們也忽略任何:dependent規則。

相關問題