2010-09-30 80 views
0

如何在表中將所有記錄設置爲0?更新 - - 我想要做的是以下。我有一張名爲Pages的表格,其中包含一個稱爲position的屬性。 當我從表中刪除頁面時,我想要som函數來重新排列位置,這樣就不會有任何未使用的位置。Rails將所有記錄值設置爲零

EX。位置 1,2,4,8,9,12 變得 1,2,3,4,5,6

+0

我不確定你在問什麼 - 你的表是什麼樣的?您是否試圖從表中刪除所有行或更改其值? – Codebeef 2010-09-30 13:05:03

+0

您是否必須將特定列中的所有值或所有列中的所有值都設爲0。 – Rohit 2010-09-30 13:06:15

+0

馬特先生請解釋「最差傳球」是什麼意思? – andkjaer 2010-10-07 08:11:10

回答

4
 
Pages.find(:all).sort_by(&:position).each_with_index do |page, index| 
    page.position = index + 1 
    page.save 
end 
+2

這應該被封裝在一個交易中,或者當它同時在多個過程中運行時,您將最終獲得重複職位! – 2010-09-30 15:45:35

0

Model.all.map { |m| m.field = 0 }.save!

然而,這將創造儘可能多的請求作爲你有記載,因此在如果您有很多或記錄,我建議使用類似this

0

如果您使用acts_as_list插件,它應該自動處理位置重新編號。

3

要回答你的第一個問題,

Pages.update_all(:position => 0) 

一種方法來更新位置陣列時,被刪除的位置是在before_destroy回調。這隻有在Rails'destroy方法是記錄被刪除的唯一方法時纔可靠!

def decrement_positions 
    Pages.update_all('position = position - 1', ['position > ?', position]) 
end 

before_destroy :decrement_positions 

一個競爭條件設置中的所有位置,在一次相鄰值將下降到SQL免費的方式:

Pages.update_all('position = 1 + (select count(1) from pages p where p.position < pages.position)') 
+0

喲應該把'網頁',而不是'網頁'。這種方式比de'each'更好,因爲數據庫只執行一個查詢。 – axeltaglia 2014-09-18 19:25:25

0

我想使用插件acts_as_list,像安德魯建議,是一個好主意,如果你需要所有的功能,否則,我會設置一個after_destroy過濾器。

after_destroy :fix_order 
def fix_order 
    Page.order('position asc').all.each_with_index do |page, index| 
    page.update_attribute(:position, index + 1) unless page.position == index + 1 
    end 
end