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

ドキュメントはそれを言い、コールバック#update_attribute()#save()呼び出します。

数か月前に同じ問題が発生しましたが、コールバックを呼び出さずにレコードを保存することはできないと思います。

編集

#update_column()コールバックをスキップするドキュメントを見たところです。

于 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 に答える