0

我有这个循环

 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 以便我可以按某种顺序排列页面

有任何想法吗

4

3 回答 3

1

The docs say that #update_attribute() and #save() invoke callbacks.

I had the same issue a few months ago and I don't think you can save a record without the callbacks being invoked.

Edit

I just saw #update_column() in the docs, which skips callbacks.

于 2012-11-18T19:55:14.030 回答
1

似乎update_column可以解决问题

于 2012-11-18T19:56:34.287 回答
1

那这个呢?

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

这种方法的优点是您可以针对任意数量的行发出单个 SQL 查询。不过需要注意的是,这不会改变sort_order内存中任何模型的属性。

这避开了整个回调链。update_attribute的文档说跳过了验证,但调用了回调

于 2012-11-18T19:57:40.637 回答