2010-12-16 1 views
0

次の問題が発生しました: XとYの2つのモデルがあります:has n, :<name>, :through => Resouce; x.ys = array_with_500_ysのようなことをしているとき、DataMapperはクエリごとに1つの関連付けしか挿入しないので、実際には時間がかかります(insert into xs_ys(x_id, y_id) values(xid, yid))。これは本当に時間がかかります。 質問は、これをより速くする方法です。Ruby:DataMapperにはn、:xyz、:through =>リソース

ありがとうございました。

答えて

0

DataMapperは「バックエンド」を抽象化しているため、標準的な動作はSQL(または使用しているもの)として一度に1つのレコードを挿入することです。

あなたがそのようなPostgresのように、SQLバックエンドを使用していると仮定すると、あなたが戻っ生のSQLにドロップすると、次の操作を実行できます。

x = X.first 
query = "INSERT INTO xs_ys(x_id, y_id) VALUES" 
vals = [] 
array_with_500_ys.each do |y| 
    vals << "(#{x.id}, #{y.id})" 
end 

repository.adapter.execute(query + vals.join(',')); 

これは、すべてのレコードが挿入されるように渡して、1「挿入」を作成します。これがもっと速くなるかどうかは確かではありませんが、ユーザーがタイムアウトしないようにアプリが必要な場合は、バックグラウンドジョブに入れることができます。

+0

ええ、その気がしました、ただもっと良い解決策があると思っただけです。ありがとう、それをそのまま残します。 – Daniel

関連する問題