ActiveRecord - 在单个查询中更新不同记录的单列数据

时间:2012-08-09 02:09:59

标签: sql ruby-on-rails

是否可以在一个查询中更新以下数据?

ID             Seq
2               2
1               4
4               1
3               3 

最好是使用rails活动记录来完成,否则使用sql查询也会非常好。

这样做的原因是我需要根据ajax请求频繁更新一组ID。我相信在单个查询中完成它会更加优化。

3 个答案:

答案 0 :(得分:1)

我猜你是在询问是否可以在一次交易中完成更新。

在rails中,您可以使用ActiveRecord::Base.transaction来实现此目的。例如,对于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

答案 1 :(得分:0)

我们无法使用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);")

答案 2 :(得分:0)

herehere找到我想要的解决方案。

这就是我使用活动记录的方式。

_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("','")}') "