有沒有辦法跳過回調和驗證通過在Rails 3中沿着這些線做些事情?跳過回調和驗證
Object.save(:validate => false, :skip_callbacks => true)
謝謝!
有沒有辦法跳過回調和驗證通過在Rails 3中沿着這些線做些事情?跳過回調和驗證
Object.save(:validate => false, :skip_callbacks => true)
謝謝!
我遇到過這樣的事情之前,我用這個:
Model.send(:create_without_callbacks)
Model.send(:update_without_callbacks)
http://guides.rubyonrails.org/active_record_validations_callbacks.html詳細列出了一些避免回調和驗證的方法 - 但這些方法都不包括'保存'。
但是,驗證和回調的關鍵是強制執行業務邏輯。如果你避免他們 - 你應該問自己爲什麼。
Object.save(:validate => false)
作品如你所願。據我所知,你不能關閉回調(除非你從before_回調中返回false,但是會中止事務)。
跳過回調有點棘手。一些插件和適配器添加了自己的「基本」回調(acts_as_nested_set,oracle_enhanced_adapter作爲示例)。
您可以使用skip_callback
和set_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
對於Rails 3中跳過回調,您可以使用update_all
了給定目的。
來源:update_all
跳過回調的完整列表,在這裏:
如果您嘗試更新的記錄跳過所有回調和驗證您c應該使用update_columns
傳遞屬性散列。此方法將更新數據庫上的列。
例如:
object.update_columns(name: 'William')
如果你想創建一個新的對象,不幸的是,我認爲是沒有方法跳過這兩個驗證和回調。 save(:validate => false)
適用於驗證。對於回調,你可以使用skip_callback
,但要小心,你的代碼可能不會線程安全。
+1非常感謝... – ecoologic
在Rails 4中不起作用。 –