如何在表格中将所有记录设置为0? - 更新 - 我想做的是以下内容。我有一个名为Pages的表,其中有一个名为position的位置。 当我从表中删除页面时,我希望som函数重新排序位置,这样就不会有任何未使用的位置。
EX。位置 1,2,4,8,9,12 变 1,2,3,4,5,6
答案 0 :(得分:4)
Pages.find(:all).sort_by(&:position).each_with_index do |page, index| page.position = index + 1 page.save end
答案 1 :(得分:4)
回答你的第一个问题,
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)')
答案 2 :(得分:0)
Model.all.map { |m| m.field = 0 }.save!
然而,这将创建与您拥有的记录一样多的请求,因此如果您有许多或记录,我建议使用 this 之类的内容。
答案 3 :(得分:0)
如果您使用的是acts_as_list插件,则应自动处理位置重新编号。
答案 4 :(得分:0)
我认为使用插件acts_as_list,就像Andrew建议的那样,如果你需要所有的功能,这是一个好主意,否则,我只会设置一个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