是否可以在一个查询中更新以下数据?
ID Seq
2 2
1 4
4 1
3 3
如果可以使用 rails 活动记录来完成,那将是最好的,否则使用 sql 查询也可以。
这样做的原因是我有一个场景,我需要根据 ajax 请求频繁更新一组 id。我相信在单个查询中完成它会更加优化。
是否可以在一个查询中更新以下数据?
ID Seq
2 2
1 4
4 1
3 3
如果可以使用 rails 活动记录来完成,那将是最好的,否则使用 sql 查询也可以。
这样做的原因是我有一个场景,我需要根据 ajax 请求频繁更新一组 id。我相信在单个查询中完成它会更加优化。
我猜您是在问是否可以在单个事务中完成一组更新。
在 Rails 中,您可以为此目的使用ActiveRecord::Base.transaction 。例如,对于 a Model
,您可以:
Model.transaction do
Model.update(2, {:seq => 2} )
Model.update(1, {:seq => 4} )
Model.update(4, {:seq => 1} )
Model.update(3, {:seq => 3} )
end
我们不能使用 Active Record 在单个查询中直接调用多个更新。正如你所说,我们可以在 Rails 中将其作为 sql 查询运行。
sql = ActiveRecord::Base.connection();
sql.execute("INSERT into products (id,name,description) VALUES (id-1,'name4','desc4'),(id-2,'name5','desc5'),(id-3,'name6','desc7') ON DUPLICATE KEY UPDATE name=VALUES(name),description=VALUES(description);")
这就是我使用活动记录的方式。
_params = ["12", "9", "13", "14", "15", "16"]
db = ActiveRecord::Base.connection();
query = "UPDATE #{self.table_name} SET display_order = CASE id "
_params.each_with_index do |d,i|
query += sanitize_sql(["WHEN ? THEN ? ",d,i])
end
query += "END "
query += "WHERE id in ('#{_params.join("','")}') "