Rails将所有记录值设置为零

时间:2010-09-30 13:02:33

标签: ruby-on-rails

如何在表格中将所有记录设置为0? - 更新 - 我想做的是以下内容。我有一个名为Pages的表,其中有一个名为position的位置。 当我从表中删除页面时,我希望som函数重新排序位置,这样就不会有任何未使用的位置。

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

5 个答案:

答案 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