2011-06-30 143 views
13

有沒有辦法跳過回調和驗證通過在Rails 3中沿着這些線做些事情?跳過回調和驗證

Object.save(:validate => false, :skip_callbacks => true) 

謝謝!

回答

5

我遇到過這樣的事情之前,我用這個:

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

+1非常感謝... – ecoologic

+1

在Rails 4中不起作用。 –

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

跳過回調的完整列表,在這裏:

  • 遞減
  • decrement_counter
  • 刪除
  • DELETE_ALL
  • 的find_by_sql
  • INC種類調和
  • increment_counter
  • 撥動
  • 觸摸
  • update_column
  • update_all
  • update_counters

來源:Skipping Callbacks

1

如果您嘗試更新的記錄跳過所有回調和驗證您c應該使用update_columns傳遞屬性散列。此方法將更新數據庫上的列。

例如:

object.update_columns(name: 'William')

如果你想創建一個新的對象,不幸的是,我認爲是沒有方法跳過這兩個驗證和回調。 save(:validate => false)適用於驗證。對於回調,你可以使用skip_callback,但要小心,你的代碼可能不會線程安全。