何千ものレコードをすばやく破棄する方法を理解するのに問題があります。
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
このようなものがどこにも見つからなかったのは奇妙です。