Rails 3跳过验证和回调

Joh*_*ssy 70 activerecord ruby-on-rails ruby-on-rails-3

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

Din*_*tih 118

这适用于Rails 3:

Model.skip_callback(:create)
model.save(:validate => false)
Model.set_callback(:create)
Run Code Online (Sandbox Code Playgroud)

(API文档相关问题)

  • 这不能是线程安全的吗?能够在实例级别设置它会很高兴.. (19认同)
  • 难道你不需要再使用```set_callback(:create)```?我的印象是```skip_callback```在重新启用之前禁用它. (5认同)

bow*_*ior 29

使用ActiveRecord :: Persistence#update_column,如下所示:

Model.update_column(field, value)
Run Code Online (Sandbox Code Playgroud)

  • 我认为您查看了`update_attribute`的文档,而不是`update_column`.如果查看`update_column`的文档,它相当于单个列的`update_columns`.`update_columns`的文档清楚地表明跳过了验证和回调. (5认同)

Bra*_*rth 10

如果目标是简单地插入或更新没有回调或验证的记录,并且您希望在不借助其他宝石,添加条件检查,使用RAW SQL或以任何方式使用现有代码进行操作的情况下执行此操作,则可能是可以使用指向现有数据库表的"影子对象".像这样:

class ImportedUser < ActiveRecord::Base
  # To import users with no validations or callbacks
  self.table_name = 'users'
end
Run Code Online (Sandbox Code Playgroud)

这适用于每个版本的Rails,线程安全,完全消除所有验证和回调,而无需修改现有代码.只需记住使用新类插入对象,例如:

ImportedUser.new( person_attributes )
Run Code Online (Sandbox Code Playgroud)

  • 这太聪明了。救了我的头痛! (2认同)