【问题标题】:How to disable ActiveRecord callbacks in Rails 3?如何在 Rails 3 中禁用 ActiveRecord 回调?
【发布时间】:2010-12-20 16:37:55
【问题描述】:

我想在 Rails 3 中跳过/禁用ActiveRecord 回调。以下是我想到的一个示例解决方案——创建一个定义为创建没有回调的对象的属性。

product = Product.new(title: 'Smth')
product.send(:create_without_callbacks)

上面的例子和this answer中的例子类似,但是作者说它是针对专门 Rails 2的。有没有类似的,甚至更好的方法来做到这一点 Rails 3

【问题讨论】:

    标签: ruby ruby-on-rails-3 activerecord callback


    【解决方案1】:
    1. 查看问题:How can I avoid running ActiveRecord callbacks?
    2. This blog post有另一种解释,举例说明。

    【讨论】:

    • 博文提到了 Rails 3 的解决方案。私有 create_without_callbacks 方法在 Rails 3 中被删除。您是否考虑在回调中放置异常?
    • 嗯...我想禁用它“每个实例”/“每个进程”。该博客解释了如何全局禁用它。
    • @xpepermint 我在答案中链接到的博客文章显示了另一种解决方案。它适用于 Rails 3 和 4。
    【解决方案2】:

    您可能会发现这里的解决方案很有帮助:http://manuelvanrijn.nl/blog/2012/01/12/disable-rails-before-slash-after-callback/

    TL;DR - 如果您正在执行此生产,创建一个类(请参阅博客文章)以保持您的代码 DRY 可能会有所帮助。否则,如果您这样做一次,或者甚至在测试中(像我一样),您可以简单地执行以下操作:

    SomeModel.skip_callback(:save, :before, :before_action)
    SomeModel.skip_callback(:save, :after, :after_action)
    

    博客文章提供了一个很好的回调列表,上面的方法可以使用。

    这在 Rails 3 和 Rails 4 中都有效。正如评论所指出的,如果您必须禁用回调,您可能想问自己为什么需要这些回调。为了扩展,禁用回调仅在生产中是有问题的。如果您需要在测试中禁用它们(这是我自己正在做的),这是可以接受的......特别是因为 Rails 4 核心不推荐使用观察者。

    【讨论】:

      【解决方案3】:
      SomeModel.skip_callback(:save) do 
         somemodel_instance.save
      end
      

      测试:Rails 4.2.1

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-12-14
        • 1970-01-01
        相关资源
        最近更新 更多