我有这个循环
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,以便我可以按顺序排列页面
任何想法
答案 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的文档说明已跳过验证,但调用了回调 。