2011-06-30 12 views

答えて

5

を私は前にそのような何かに遭遇し、私はこれを使用:

Model.send(:create_without_callbacks) 
Model.send(:update_without_callbacks) 
+0

+1ありがとうございました... – ecoologic

+1

Rails 4では動作しません。 –

0

http://guides.rubyonrails.org/active_record_validations_callbacks.html詳細コールバックと検証を回避する小さなリスト - 「保存」もありません。

ただし、検証とコールバックのポイントはビジネスロジックを強制することです。あなたがそれらを避けているなら - あなたはなぜ自分自身に尋ねるべきです。

も参照してください:あなたのようにHow can I avoid running ActiveRecord callbacks?

15
Object.save(:validate => false) 

作品が期待されます。私が知っている限り、コールバックをオフにすることはできません(before_コールバックからfalseを返さない限り、トランザクションを中断しない限り)。

3

コールバックをスキップするのはちょっと難しいです。一部のプラグインとアダプタは、独自の「必須」コールバック(acts_as_nested_set、oracle_enhanced_adapter)を追加します。

スキップできるものを確認するには、skip_callbackset_callbackの方法を使用できます。

いくつかのカスタムクラスメソッドは助けることができる:

def skip_all_callbacks(klass) 
    [:validation, :save, :create, :commit].each do |name| 
     klass.send("_#{name}_callbacks").each do |_callback| 
     # HACK - the oracle_enhanced_adapter write LOBs through an after_save callback (:enhanced_write_lobs) 
     if (_callback.filter != :enhanced_write_lobs) 
      klass.skip_callback(name, _callback.kind, _callback.filter) 
     end 
     end 
    end 
    end 



    def set_all_callbacks(klass) 
    [:validation, :save, :create, :commit].each do |name| 
     klass.send("_#{name}_callbacks").each do |_callback| 
     # HACK - the oracle_enhanced_adapter write LOBs through an after_save callback (:enhanced_write_lobs) 
     if (_callback.filter != :enhanced_write_lobs) 
      klass.set_callback(name, _callback.kind, _callback.filter) 
     end 
     end 
    end 
    end 
1

のRails 3でコールバックをスキップするために、あなたは与えられたためupdate_allを使用することができます目的。

出典:update_all

コールバックをスキップする完全なリストはここにある:

  • DELETE_ALL
  • find_by_sql
  • 株式会社を削除
  • decrement_counter
  • をデクリメント
  • トグル
  • タッチ
  • update_column
  • update_all update_counters

ソースincrement_counterリーメント

  • Skipping Callbacks

  • 1

    あなたはすべてのコールバックをスキップしてレコードを更新しようとしている場合と、あなたの検証ould属性のハッシュを渡してupdate_columnsを使用してください。このメソッドは、データベース上の列を直接更新します。例えば

    object.update_columns(name: 'William')

    あなたは新しいオブジェクトを作成したい場合は、残念ながら私は、検証とコールバックの両方をスキップする方法がないと思います。 save(:validate => false)は検証のために機能します。コールバックの場合はskip_callbackを使用できますが、注意してください。おそらくコードはスレッドセーフではありません。

    関連する問題