为什么我的before_ *继续触发

时间:2012-11-18 19:51:50

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

我有这个循环

 pages.each{|page| page.update_attribute(:sort_order, self.sort_order.to_i + 1)}

我使用update_attribute跳过before_update或者没有调用before_save

before_save :set_data
before_update :set_data

但是再次调用了set_data ....关于如何避免这种情况的任何想法

我甚至尝试了以下

 pages.each do |page| 
   page.sort_order = self.sort_order.to_i + 1
   page.save(:validate => false)
 end

我正在尝试更新并将后续页面更新为sort_order + 1,以便我可以按顺序排列页面

任何想法

3 个答案:

答案 0 :(得分:1)

文档说#update_attribute()#save()会调用回调。

几个月前我遇到了同样的问题,如果没有调用回调,我认为你不能保存记录。

修改

我刚刚在文档中看到#update_column(),它会跳过回调。

答案 1 :(得分:1)

似乎update_column可能会解决问题

答案 2 :(得分:1)

这个怎么样?

Page.where(:id => pages.collect(&:id)).update_all('sort_order=sort_order+1')

此方法的优点是您可以为任意数量的行发出单个SQL查询。但请注意,这不会改变内存中任何模型的sort_order属性。

这一方面是整个回调链的一部分。 update_attribute的文档说明已跳过验证,但调用了回调