Czy istnieje sposób na pomijanie wywołań zwrotnych i sprawdzanie poprawności, wykonując coś wzdłuż tych linii w Rails 3?Pomijanie wywołań zwrotnych i sprawdzanie poprawności
Object.save(:validate => false, :skip_callbacks => true)
Dzięki!
Czy istnieje sposób na pomijanie wywołań zwrotnych i sprawdzanie poprawności, wykonując coś wzdłuż tych linii w Rails 3?Pomijanie wywołań zwrotnych i sprawdzanie poprawności
Object.save(:validate => false, :skip_callbacks => true)
Dzięki!
natknąłem coś takiego wcześniej i użyłem to:
Model.send(:create_without_callbacks)
Model.send(:update_without_callbacks)
http://guides.rubyonrails.org/active_record_validations_callbacks.html zawiera niewielką listę metod, które pozwalają uniknąć wywołań zwrotnych i sprawdzeń poprawności - żaden z nich nie obejmuje "zapisz".
Jednak celem sprawdzania poprawności i wywołań zwrotnych jest wymuszanie logiki biznesowej. Jeśli ich unikasz - powinieneś zadać sobie pytanie, dlaczego.
Zobacz także: How can I avoid running ActiveRecord callbacks?
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).
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
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:
Źródło: Skipping Callbacks
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.
+1 z wieloma podziękowaniami ... – ecoologic
Nie działa w Railsach 4. –