2011-06-30 22 views

Odpowiedz

5

natknąłem coś takiego wcześniej i użyłem to:

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

+1 z wieloma podziękowaniami ... – ecoologic

+1

Nie działa w Railsach 4. –

15
Object.save(:validate => false) 

działa tak jak oczekujemy. O ile wiem, nie można wyłączyć wywołań zwrotnych (chyba że zwrócisz wartość false z wywołania zwrotnego before_, ale to spowoduje przerwanie transakcji).

3

Pomijanie połączeń zwrotnych jest nieco trudne. Niektóre wtyczki i adaptery dodają własne "podstawowe" wywołania zwrotne (acts_as_nested_set, oracle_enhanced_adapter jako przykłady).

Można użyć metod skip_callback i set_callback w sprawdzaniu, które z nich można pominąć.

Niektóre metody niestandardowej klasy może pomóc:

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

Dla omijając zwrotnych w Rails 3, można użyć update_all na Twój podano cel, powód.

Źródło: update_all

Pełna lista na pomijanie zwrotnych tutaj:

  • zmniejszyć
  • decrement_counter
  • usuwać
  • delete_all
  • find_by_sql
  • inc rement
  • increment_counter
  • przełącznik
  • dotykowy
  • update_column
  • update_all
  • update_counters

Źródło: Skipping Callbacks

1

Jeśli próbujesz zaktualizować rekord przeskakując wszystkie wywołania zwrotne i zatwierdzenia c może użyć update_columns przekazując skrót wartości atrybutów. Ta metoda zaktualizuje kolumny bezpośrednio w bazie danych.

Na przykład:

object.update_columns(name: 'William')

Jeśli chcesz utworzyć nowy obiekt, niestety myślę, że nie ma sposobu, aby pominąć zarówno walidacji i zwrotnych. save(:validate => false) działa dla sprawdzania poprawności. W przypadku wywołań zwrotnych możesz użyć skip_callback, ale uważaj, Twój kod prawdopodobnie nie będzie bezpieczny dla wątków.

Powiązane problemy