记录更新将更新rails 3.1中的模型,全局排序中的所有其他记录

时间:2011-10-17 10:07:49

标签: ruby-on-rails ruby-on-rails-3 activerecord ruby-on-rails-3.1

当我更新单个记录上的属性时,我想更新rails(3.1)模型中的所有记录。

与self.update_attribute(:global_order => 1)一样,然后在保存之前或之后,想要更新所有其他记录以更新其global_order(1,2,3,4)。

现在on after after_save回调我陷入了一个递归循环,跳过回调的方式去?如果global_order中的任何内容看起来很奇怪,我希望应用程序抛出异常。

或者有任何3.1宝石可以解决我的问题。

after_save :set_global_order

def set_global_order
    @products = self.class.all(:order => :global_order)
    @products.sort! {|a,b| a.global_order <=> b.global_order}
    @products.reverse!
    @products.each_with_index do |p, index|
        p.update_attributes!({:global_order => index + 1})
    end
end

1 个答案:

答案 0 :(得分:0)

不确定是否有宝石,但你绝对可以通过以下考虑重构:

  • 当本地变量
  • 时,不需要使用实例变量污染对象
  • 前三行是对同一组进行排序,为什么不这样做呢?

...

def set_global_order
  products = self.class.order('global_order DESC')

  products.each_with_index do |p, index|
    p.update_column(:global_order, index + 1)
  end
end