【发布时间】:2013-08-30 15:59:07
【问题描述】:
有没有更好的方法在 Ruby on Rails 中用不同的值在一个查询中更新更多记录?我在 SQL 中使用 CASE 解决了这个问题,但是有什么 Active Record 解决方案吗?
基本上,当新列表从 jquery ajax 帖子返回时,我会保存新的排序顺序。
#List of product ids in sorted order. Get from jqueryui sortable plugin.
#product_ids = [3,1,2,4,7,6,5]
# Simple solution which generate a loads of queries. Working but slow.
#product_ids.each_with_index do |id, index|
# Product.where(id: id).update_all(sort_order: index+1)
#end
##CASE syntax example:
##Product.where(id: product_ids).update_all("sort_order = CASE id WHEN 539 THEN 1 WHEN 540 THEN 2 WHEN 542 THEN 3 END")
case_string = "sort_order = CASE id "
product_ids.each_with_index do |id, index|
case_string += "WHEN #{id} THEN #{index+1} "
end
case_string += "END"
Product.where(id: product_ids).update_all(case_string)
这个解决方案运行速度很快,而且只有一个查询,但我创建了一个查询字符串,就像在 php.ini 中一样。 :) 你有什么建议?
【问题讨论】:
-
你的表有多大,你真的想要一个查询吗?我认为要么您选择更易于阅读,并且有多个查询,要么您有一个查询并且它变得更加混乱。根据这个查询的执行频率(以及索引的设置方式),我认为多个查询应该没问题。
-
罗吉尔,感谢您的评论。你说的对。我同意你的看法。如果我有一个包含 20 个元素的列表,包含 20 个查询,则需要 100-150 毫秒,所以没什么大不了的。但是一个查询只需要 2 毫秒,我得到了相同的结果。当然,在这种情况下,可能并不真正需要它,但如果了解一个用更少查询使数据库更快的一般概念,那就太好了。 :)
-
我对您的方法是否正确,如果您更改两种产品的顺序,则需要更改表中每个产品(即行)的排序顺序(或至少每行之间' 2 个产品),因此随着产品表的增长,行更新的数量也会增长?在这种情况下,为什么不考虑一个简单地保存以逗号分隔的排序 id 字符串的新表呢?在展示产品之前阅读它,在重新订购后更新它?
标签: sql ruby-on-rails ruby-on-rails-4 arel