有没有办法在Rails 3中按照这些方法做一些事情来跳过回调和验证?
Object.save(:validate => false, :skip_callbacks => true)
谢谢!
答案 0 :(得分:15)
Object.save(:validate => false)
按预期工作。据我所知,你不能关闭回调(除非你从before_回调中返回false,但那会中止事务)。
答案 1 :(得分:3)
跳过回调有点棘手。一些插件和适配器添加了自己的"必要的"回调(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
答案 2 :(得分:3)
之前我遇到过类似的东西,我用过这个:
Model.send(:create_without_callbacks)
Model.send(:update_without_callbacks)
答案 3 :(得分:1)
为了在Rails 3中跳过回调,你可以使用update_all
来达到你的目的。
来源:update_all
跳过回调的完整列表如下:
答案 4 :(得分:1)
如果您尝试更新跳过所有回调和验证的记录,可以使用update_columns
传递属性哈希。此方法将直接在数据库上更新列。
例如:
object.update_columns(name: 'William')
如果你想创建一个新对象,遗憾的是我认为没有方法可以跳过验证和回调。 save(:validate => false)
适用于验证。对于回调,您可以使用skip_callback
,但要小心,您的代码可能不是线程安全的。
答案 5 :(得分:0)
http://guides.rubyonrails.org/active_record_validations_callbacks.html详细列出了避免回调和验证的一小部分方法 - 但这些方法都不包括“保存”。
但是,验证和回调的重点是强制执行业务逻辑。如果你正在避免它们 - 你应该问问自己为什么。