Rails 3跳过验证和回调

我有一个定义了验证和回调的特别复杂的模型。业务现在需要调用特定的场景,其中添加新记录需要跳过验证和回调。最好的办法是什么?

71868 次浏览

这在 Rails 3中是可行的:

Model.skip_callback(:create)
model.save(:validate => false)
Model.set_callback(:create)

(API 文件相关问题)

如何向模型中添加一个方法,让您跳过回调?

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

如果您最终使用类似这样的东西,我建议在方法中使用 self 而不是模型名,以避免名称的认可。

我还偶然发现了斯文 · 福克斯的一个要点,看起来不错,是 给你

我的看法是这样的(注意: 这将禁用 create、 update、 delete 和其他需要添加到 array 中的回调)。

    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

使用 持久性 # update _ column,像这样:

Model.update_column(field, value)

这种方法最终对我有效(为对象重新定义了 _notify_comment_observer_for_after_create方法) :

if no_after_create_callback
def object._notify_comment_observer_for_after_create; nil; end
end

我编写了一个简单的 gem 来跳过即席验证,但是它也可以更新为包含跳过回调。

Https://github.com/npearson72/validation_skipper

您可以在 gem 中使用 can_skip_validation_for并添加跳过回调的功能

其他一切都是一样的,如果你需要帮助,告诉我。

我建议不要使用 Skip _ callback 方法,因为它不是线程安全的。然而,鬼鬼祟祟的保存宝石是因为它只运行直线 sql。注意,这不会触发验证,因此您必须自己调用它们(例如: my _ model)。有效?).

以下是他们的医生提供的一些样本:

# 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!

如果目标只是简单地插入或更新一个记录而不需要回调或验证,而且你不想求助于其他 gems,添加条件检查,使用 RAW SQL,或者以任何方式对现有代码进行未完成的处理,那么可以使用一个指向现有 db 表的“影子对象”。像这样:

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             |                |