2011-07-14 44 views
3

我正在使用Ruby on Rails 3.0.7,並且我有一個position數據庫表列以處理可排序的記錄列表。我想更新該列中所有符合某些條件的記錄,以銷燬position值爲「處於所有位置值中間」的記錄,但將訂單(數字)保留在position列中。更新所有匹配某些條件但在數據庫表列中保留「位置索引」值的記錄

也就是說,例如,如果在類對象的下面的列表我毀滅與positionuser_id記錄

#<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所有其他記錄所以有

#<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值。

回答

4

我猜你在找什麼是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]) 

這將拉動上面的刪除位置的所有位置下來一個缺口..

+0

什麼是「集更新的文章...... 「? – Backo

+0

這只是純粹的SQL作爲你的例子。如果您不熟悉SQL,可以忽略它。只需看看update_all代碼:) – Casper

+0

謝謝(15個字符...)。 – Backo

相關問題