2012-08-09 32 views
-1

是否可以在单个查询中更新以下数据?ActiveRecord - 在单个查询中更新不同记录的单列数据

ID    Seq 
2    2 
1    4 
4    1 
3    3 

这将是最好的,如果它可以用轨道活动记录完成,否则与SQL查询将会非常好。

这样做的原因是我有场景,我需要经常基于ajax请求更新一组id。我相信它在单个查询中完成得更加优化。

+0

更好地说出问题。 – edhedges 2012-08-09 02:18:00

+0

这是一个正确的问题。为什么downvote? – TonyTakeshi 2012-08-09 10:50:32

+0

我不是downvote,但当我第一次看到这个问题需要改进。 – edhedges 2012-08-09 12:21:13

回答

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

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

在导轨中,您可以使用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 
+0

谢谢。它绝对是解决方案之一。 – TonyTakeshi 2012-08-10 03:12:31

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);") 
相关问题