Ruby on rails 如何跳过ActiveRecord回调?

Ruby on rails 如何跳过ActiveRecord回调?,ruby-on-rails,rails-activerecord,Ruby On Rails,Rails Activerecord,可能重复: 我有这样的模型 class Vote < ActiveRecord::Base after_save :add_points_to_user ..... end 类投票:true进行设置或将其拖到链的开头。如果skip/set在不影响序列的情况下确实执行了停用/重新激活操作,那就太好了。我的示例在中。这不是线程安全的。因此,如果在多线程服务器上运行此操作,请小心。这不会跳过回调,只是ValidationUpdate\u会跳过来自以下服务器的回调:“它不

可能重复:

我有这样的模型

class Vote < ActiveRecord::Base  
    after_save :add_points_to_user

    .....
end
类投票

是否有可能在保存时以某种方式强制模型跳过调用
将\u点添加到\u用户
?对于Rails 2,可能类似于
ActiveRecord#delete
vs
ActiveRecord#destroy

,但对于Rails 3,您可以使用这些:

object.send(:create_without_callbacks)
object.send(:update_without_callbacks)
对于Rails 3,提供了必要的控制。在一个数据集成场景中,我也面临着同样的挑战,在这个场景中,通常需要的回调需要被忽略。您可以集体重置\u回调,或使用跳过\u回调明智地禁用,如下所示:

Vote.skip_callback(:save, :after, :add_points_to_user)

…之后,您可以对投票实例进行操作:添加_points _to _userinhibited

以下内容适用于rails 2、rails 3和rails 4:

它提供了一个跳过回调的方法列表,解释了为什么不仔细考虑就使用它们是危险的。根据知识共享署名共享3.0许可证的规定在此转载

12跳过回调

与验证一样,也可以跳过回调。这些 但是,使用方法时应谨慎,因为 业务规则和应用程序逻辑可以保存在回调中。 在不了解潜在影响的情况下绕过它们可能会 导致数据无效

  • 减量
  • 减量计数器
  • 删除
  • 全部删除
  • 通过\ sql查找\ U
  • 增量
  • 递增计数器
  • 拨动
  • 触碰
  • 更新列
  • 全部更新
  • 更新计数器

这将跳过您的验证:

vote.save(:validate => false)
更多信息

要跳过回调和验证,可以使用、更新第v列(3.1)或更新全部

vote = Vote.first
vote.update_column(:subject, 'CallBacks')
另外,这仅适用于ActiveRecord 3.1

或:

最后,您还有i finally选项,这将跳过所有内容:

execute "UPDATE votes SET subject = 'CallBacks' WHERE id = YourID"


好的,最后一个不太漂亮。

不幸的是,这在Rails 3中不再有效:(请参阅我的答案,以获取有关Rails 2和Rails 3的建议。
Model
具有误导性,这些是AR实例的方法,而不是classmethods,所以
record.send(:创建不带回调的\u)
@tokland刚刚找到了这个答案,并在您的评论帮助下更新了答案。如果您不想永久删除回调,但只说一次创建/保存,那么您必须在跳过回调后重新启用它:
User.set\u回调:save,:after,:add\u points\u to\u User
也不要这样做如果你在两次调用之间所做的任何事情都可能引发异常,你可能应该将其包装为begin(-rescue)-sure-block。特定实例是否有类似的功能?我可能建议的是,在类上使用
:if
选项,如
if:lambda,以声明方式设置
skip_callback
{@skip_回调==true}
,并编写方法来包装需要执行此操作的情况:
定义一些特殊操作!@skip\u callbacks=true;do\u something;save!;@skip\u callbacks=false;end
可以使用上下文管理器方法来设置/取消ivar并生成一个块,但如果您经常需要此方法,则可能有问题;-)编辑Ugh,我讨厌如此评论换行限制。请注意
跳过回调
设置回调
如何影响回调顺序。如果我正确阅读了,它们实际上会删除并重新添加回调。默认情况下,它会添加到链的末尾。设置时,可以使用
:prepend=>:true
进行设置或将其拖到链的开头。如果skip/set在不影响序列的情况下确实执行了停用/重新激活操作,那就太好了。我的示例在中。这不是线程安全的。因此,如果在多线程服务器上运行此操作,请小心。这不会跳过回调,只是ValidationUpdate\u会跳过来自以下服务器的回调:“它不会实例化涉及的模型,也不会触发活动记录回调或验证。”update_列也可以工作,但上面的语法不正确。它需要2个参数:vote.update_列(:subject,'callbacks'))以我的拙见,这个声称已经有答案的问题,只有不正确的答案。所以我认为这不符合重复的条件。我认为下面提供的答案是官方认可的回调排除方法。正如我所知,在Rails 4.2中,只切换change object,但不保存到数据库,您需要调用save met切换后的hod。如果使用toggle!,它将立即保存,但会触发回调,因此,应将其从此列表中删除。@zw963 but toggle!不在列表中,因此不需要删除。您是说非bang toggle也会触发回调,因此需要删除吗?ActiveRecord回调上的Rails指南仍然会在列表之间切换4.2.1中跳过回调的方法。我的理解是,某些方法可以将数据保存到数据库,而不是触发回调,它应该在列表中。但是,切换不是保存数据。啊,现在我明白了。不,这不是修改数据库的方法列表。这是一个可以修改状态(持久化或非持久化)的方法列表没有触发与修改的属性相关联的回调的模型。我理解最初的问题专门询问了关于在保存时跳过验证的问题,但我不希望编辑引用的文本。
execute "UPDATE votes SET subject = 'CallBacks' WHERE id = YourID"