有没有更好的方法在Ruby on Rails中用不同的值更新一条查询中的更多记录?我在SQL中使用CASE解决了问题,但是有没有Active Record解决方案?使用Rails中的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中。 :)你的建议是什么?
不知您对表的大小,你真的想** **一个查询?我认为无论你选择哪一种阅读方式更容易,并且有多个查询,或者你有一个查询,它会变得更加混乱。根据这个查询完成的频率(以及如何设置索引),我认为多个查询应该没问题。 – Roger
Rogier,谢谢你的评论。你是对的。我赞同你。如果我有20个元素的列表,有20个查询,它需要100-150ms,所以没什么大不了的。但是一个查询只需要2ms,我得到了相同的结果。当然,在这种情况下,可能并不是真的需要这样做,但知道使数据库速度更快而查询次数更少的一般概念会很好。 :) – Zoltan
我说得对,如果您改变两种产品的顺序,您需要更改表中每种产品(即行)的排序顺序(或者至少在两种产品之间的每一行中) ,因此随着产品表的增长,行更新的数量也在增长?在这种情况下,为什么不考虑一个只包含以逗号分隔的经过排序的ID的字符串的新表?在展示产品前阅读它,在重新订购后更新它? – Mitch