gpt4 book ai didi

ruby-on-rails - 更新所有匹配某些条件但在数据库表列中保留 "position-indexed"值的记录

转载 作者:数据小太阳 更新时间:2023-10-29 07:57:31 26 4
gpt4 key购买 nike

我正在使用 Ruby on Rails 3.0.7 并且我有一个 position 数据库表列来处理可排序的记录列表。我想为所有匹配某些条件的记录更新该列,以销毁 position 值“在所有位置值的中间”的记录,但保持 中的顺序(数字)位置列。

也就是说,例如,如果在下面的类对象列表中,我销毁了带有 position 3user_id 的记录1

#<Article id: 1, position: 1, user_id: 1>,
#<Article id: 2, position: 1, user_id: 2>,
#<Article id: 3, position: 2, user_id: 1>,
#<Article id: 4, position: 3, user_id: 1>,
#<Article id: 5, position: 1, user_id: 3>,
#<Article id: 6, position: 4, user_id: 1>,
#<Article id: 7, position: 5, user_id: 1>,
#<...> # A lot of others records having 'user_id' = 1

我想更新与 user_id 1 相关的所有其他记录,以便拥有

#<Article id: 1, position: 1, user_id: 1>,
#<Article id: 2, position: 1, user_id: 2>,
#<Article id: 3, position: 2, user_id: 1>,
#<Article id: 5, position: 1, user_id: 3>,
#<Article id: 6, position: 3, user_id: 1>,
#<Article id: 7, position: 4, user_id: 1>,
#<...> # A lot of others records having 'user_id' = 1

当然,所有这些都要注意性能。

我该怎么做(也许在单个子句\语句中)


我知道 update_all 方法在某种程度上可以提供帮助,但我不知道如何使用它自动增加 position 值。

最佳答案

我猜你在 SQL 中寻找的是这个?

update articles set position = position - 1 
where position > pos_of_deleted and user_id = uid_of_deleted

使用 update_all 它应该转换成这样:

Article.update_all("position = position - 1", 
["position > ? and user_id = ?",
pos_of_deleted, uid_of_deleted])

这会将删除位置上方的所有位置拉低一个档次..

关于ruby-on-rails - 更新所有匹配某些条件但在数据库表列中保留 "position-indexed"值的记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6688565/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com