如何在表中將所有記錄設置爲0?更新 - - 我想要做的是以下。我有一張名爲Pages的表格,其中包含一個稱爲position的屬性。 當我從表中刪除頁面時,我想要som函數來重新排列位置,這樣就不會有任何未使用的位置。Rails將所有記錄值設置爲零
EX。位置 1,2,4,8,9,12 變得 1,2,3,4,5,6
如何在表中將所有記錄設置爲0?更新 - - 我想要做的是以下。我有一張名爲Pages的表格,其中包含一個稱爲position的屬性。 當我從表中刪除頁面時,我想要som函數來重新排列位置,這樣就不會有任何未使用的位置。Rails將所有記錄值設置爲零
EX。位置 1,2,4,8,9,12 變得 1,2,3,4,5,6
Pages.find(:all).sort_by(&:position).each_with_index do |page, index| page.position = index + 1 page.save end
這應該被封裝在一個交易中,或者當它同時在多個過程中運行時,您將最終獲得重複職位! – 2010-09-30 15:45:35
Model.all.map { |m| m.field = 0 }.save!
然而,這將創造儘可能多的請求作爲你有記載,因此在如果您有很多或記錄,我建議使用類似this。
如果您使用acts_as_list插件,它應該自動處理位置重新編號。
要回答你的第一個問題,
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)')
喲應該把'網頁',而不是'網頁'。這種方式比de'each'更好,因爲數據庫只執行一個查詢。 – axeltaglia 2014-09-18 19:25:25
我想使用插件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
我不確定你在問什麼 - 你的表是什麼樣的?您是否試圖從表中刪除所有行或更改其值? – Codebeef 2010-09-30 13:05:03
您是否必須將特定列中的所有值或所有列中的所有值都設爲0。 – Rohit 2010-09-30 13:06:15
馬特先生請解釋「最差傳球」是什麼意思? – andkjaer 2010-10-07 08:11:10