0

何千ものレコードをすばやく破棄する方法を理解するのに問題があります。

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

このようなものがどこにも見つからなかったのは奇妙です。

4

1 に答える 1

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 ここで詳細を読むことができます。コールバックやを呼び出さないdelete_allでください。ルールも無視されます。deletebefore_destroyafter_destroy:dependent

于 2013-01-13T18:30:46.970 に答える