首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何避免运行ActiveRecord回调?

如何避免运行ActiveRecord回调?
EN

Stack Overflow用户
提问于 2009-03-10 23:52:23
回答 22查看 119.2K关注 0票数 153

我有一些有after_save回调的模型。通常这很好,但在某些情况下,比如创建开发数据时,我希望在不运行回调的情况下保存模型。有没有简单的方法可以做到这一点?类似于..。

代码语言:javascript
复制
Person#save( :run_callbacks => false )

代码语言:javascript
复制
Person#save_without_callbacks

我查看了Rails文档,没有找到任何东西。然而,根据我的经验,Rails文档并不总是能说明全部情况。

更新

我找到了a blog post,它解释了如何从这样的模型中删除回调:

代码语言:javascript
复制
Foo.after_save.clear

我找不到这种方法的文档记录在哪里,但它似乎有效。

EN

回答 22

Stack Overflow用户

回答已采纳

发布于 2009-03-11 04:29:37

此解决方案仅适用于Rails 2。

我刚刚调查过这个问题,我想我有一个解决方案。您可以使用两种ActiveRecord私有方法:

代码语言:javascript
复制
update_without_callbacks
create_without_callbacks

您将不得不使用send来调用这些方法。示例:

代码语言:javascript
复制
p = Person.new(:name => 'foo')
p.send(:create_without_callbacks)

p = Person.find(1)
p.send(:update_without_callbacks)

这绝对是你真正想要在控制台中或在做一些随机测试时使用的东西。希望这能有所帮助!

票数 71
EN

Stack Overflow用户

发布于 2015-12-10 06:41:28

如果目标是在没有回调或验证的情况下简单地插入一条记录,并且您不想求助于额外的gem、添加条件检查、使用原始SQL或以任何方式混淆现有的代码,那么可以考虑使用指向现有数据库表的“影子对象”。如下所示:

代码语言:javascript
复制
class ImportedPerson < ActiveRecord::Base
  self.table_name = 'people'
end

这适用于每个版本的Rails,是threadsafe,并且完全消除了所有的验证和回调,不需要修改现有的代码。您只需在实际导入之前抛出类声明,就可以了。只需记住使用您的新类来插入对象,例如:

代码语言:javascript
复制
ImportedPerson.new( person_attributes )
票数 24
EN

Stack Overflow用户

发布于 2010-11-26 16:03:40

rails 3:

代码语言:javascript
复制
MyModel.send("_#{symbol}_callbacks") # list  
MyModel.reset_callbacks symbol # reset
票数 21
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/632742

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档