我有一个特别复杂的模型,其中包含验证和回调定义。业务需求现在需要添加新记录的特定场景需要跳过验证和回调。什么是最好的方法来做到这一点?Rails 3跳过验证和回调
回答
这个工作在Rails的3:
Model.skip_callback(:create)
model.save(:validate => false)
Model.set_callback(:create)
有关添加到您的模型,它可以让你跳过回调的方法是什么?
class Foo < ActiveRecord::Base
after_save :do_stuff
def super_secret_create(attrs)
self.skip_callback(:create)
self.update_attributes(attrs)
self.save(:validate => false)
self.set_callback(:create)
end
end
如果你最终使用这样的事情,我会建议使用自己的方法,而不是型号名称,以避免名称的connascence。
我也跑过从埃里克森福克斯一个要点,看起来不错,这是here
我喜欢这种方法,但'skip_callback'显示为一个类方法,而'update_attributes'是一个实例方法,是你想要的吗?嗯,我不明白,API文档说'skip_callback'是实例方法,但它不是在Rails控制台,奇怪。 –
我采取的是这样的(注:此禁用回调创建,用于更新,删除和其他你需要将它们添加到阵列)。
begin
[:create, :save].each{|a| self.class.skip_callback(a) } # We disable callbacks on save and create
# create new record here without callbacks, tou can also disable validations with
# .save(:validate => false)
ensure
[:create, :save].each{|a| self.class.set_callback(a) } # and we ensure that callbacks are restored
end
Upvoted,但它不适用于我的3.2.6应用程序。我打电话给Model.skip_callback(:create,:after) – TuteC
这是3.0+的解决方案它不能在2.x上工作 - 但我记得当我正在寻找解决方案时,我偶然发现了解决方案2 .x不适用于3.x –
使用ActiveRecord::Persistence#update_column,像这样:
Model.update_column(field, value)
根据您链接的文档:“调用回调。” – eggie5
我想你看过'update_attribute'的文档,而不是'update_column'。如果您查看'update_column'的文档,它相当于单个列的'update_columns'。 'update_columns'的文档明确指出验证和回调被跳过。 – bowsersenior
拯救我的生命!我试过skip_callback和其他方法,没有运气。这工作! –
这个技巧在最后为我工作(重新定义了对象_notify_comment_observer_for_after_create
法):
if no_after_create_callback
def object._notify_comment_observer_for_after_create; nil; end
end
我写了一个简单的宝石跳过验证adhoc,但它可能会更新,以包括跳过回调。
https://github.com/npearson72/validation_skipper
你可以采取在创业板上市的can_skip_validation_for
,并且还用于跳过回调添加功能。也许调用方法can_skip_validation_and_callbacks_for
其他一切工作都是一样的。如果你需要帮助,请告诉我。
我会建议不要使用skip_callback方法,因为它不是线程安全的。然而,sneaky save gem是因为它只是直接运行sql。请注意,这不会触发验证,因此您必须自己调用它们(例如:my_model.valid?)。
这里有一些样品从自己的文件:
# Update. Returns true on success, false otherwise.
existing_record.sneaky_save
# Insert. Returns true on success, false otherwise.
Model.new.sneaky_save
# Raise exception on failure.
record.sneaky_save!
如果目标是简单地插入或更新不进行回调或验证的记录,你想做到这一点,而不诉诸额外的宝石,加入条件使用RAW SQL进行检查,或以任何方式使用退出的代码进行检查,可能会使用指向现有数据库表的“阴影对象”。像这样:
class ImportedUser < ActiveRecord::Base
# To import users with no validations or callbacks
self.table_name = 'users'
end
这个工程使用Rails的每一个版本,是线程安全的,并且完全消除了所有的验证和回调不修改现有的代码。只要记住用你的新类插入对象,如:
ImportedUser.new(person_attributes)
这太聪明了。救了我头痛! –
如果你的验证写入数据库本身,这些都不会工作。
+------------------------------------+--------------------------------------------------+------+-----+--------------------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------------------------------+--------------------------------------------------+------+-----+--------------------+----------------+
| status | enum('Big','Small','Ugly','Stupid','Apologetic') | NO | | Stupid | |
- 1. 跳过Ruby on Rails验证
- 2. 跳过对Rails 3中嵌套属性的验证?
- 3. Rails 3 - 验证和:before_filter
- 4. Rails的ActiveRecord:跳过验证的协会
- 5. Rails 3:form_tag验证
- 6. Rails Wisper跳过监听器回调
- 7. JSF immediate = true验证跳过验证
- 8. Rails 3自定义验证和shoulda
- 9. Rails 3和Twilio做电话验证
- 10. formtastic和Rails 3的远程验证gem?
- 11. Django:跳过模型验证
- 12. 跳过jQuery验证标签
- 13. 跳过after_update回调
- 14. jQuery验证插件和Codeigniter - 表单跳过验证并提交
- 15. Rails 3验证问题
- 16. Rails 3:Mongoid验证问题
- 17. Rails 3特别验证
- 18. rails 3身份验证
- 19. Rails 3 - 自定义验证
- 20. rails 3关系验证
- 21. 验证,回调
- 22. Rails:跳过日志回溯
- 23. 通过回调方法验证rails activerecord字段?
- 24. 在“vagrant up”上跳过证书验证
- 25. urllib2 - 能力跳过证书验证
- 26. jQuery和Rails 3 ajax:失败回调
- 27. Rails 3 - form_for和成功/失败回调
- 28. ActiveRecord回调过程中的验证
- 29. Rails验证和自定义回调订购
- 30. Ruby On Rails身份验证与设计和(监狱)回调
难道你不需要再使用'''set_callback(:create)'''?我的印象是'''skip_callback'''禁用它,直到重新启用。 –
我想是的,我从来没有使用这种方法,更多信息http://api.rubyonrails.org/classes/ActiveSupport/Callbacks/ClassMethods.html#method-i-skip_callback – Dinatih
这不能是线程安全的?这将是很好的能够在实例级别上设置它.. –