Ruby:DataMapper并具有n,:xyz,:through =>资源

时间:2010-12-16 22:18:37

标签: ruby optimization datamapper

我遇到过以下问题: 有两种模式:X和Y,它们彼此相关联:has n, :<name>, :through => Resouce;当我做x.ys = array_with_500_ys这样的事情时,需要很长时间,因为DataMapper每个查询只插入一个关联(insert into xs_ys(x_id, y_id) values(xid, yid))。这需要很长时间。 问题是:如何加快速度?

感谢。

1 个答案:

答案 0 :(得分:0)

因为DataMapper已经抽象了“后端”,所以标准行为是一次插入一条记录作为SQL(或者你正在使用的任何东西)。

假设您正在使用SQL后端,例如Postgres,您可以回退到原始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(','));

这会创建一个'insert',传递要插入的所有记录。不确定这是否会更快,但如果你需要应用程序不为用户超时,你可以把它放到后台工作。