【问题标题】:Do fixtures trigger model callbacks?夹具会触发模型回调吗?
【发布时间】:2010-11-16 10:10:23
【问题描述】:

假设我有一个 User 模型,在 User.rb 中有以下代码:

before_create :create_dependencies
after_create :build_inbox

我还有一个 users.yml 文件,其中定义了一堆用户设备。

当我运行 rake db:fixtures:load 时,它似乎不会触发回调。

  1. 这是预期的工作方式吗?如果是这样,他们为什么要这样设计?
  2. 有没有办法在加载夹具时强制触发回调?

【问题讨论】:

    标签: ruby-on-rails ruby fixtures


    【解决方案1】:

    这是预期的工作方式吗?如果 那么,他们为什么要这样设计呢?

    是的,灯具不使用回调。我假设这是出于性能原因。在不实例化模型的情况下直接将数据加载到数据库中会更快。

    有没有办法强制触发 加载时的回调 固定装置?

    我不知道。你有几个选择。一种是构建您的固定装置,就好像回调已经被触发一样。也就是说,手动创建回调将要的数据。例如,如果您有一个对用户密码进行哈希处理的回调,您需要手动对密码进行哈希处理,然后将该哈希存储在夹具中。

    第二种解决方案(强烈推荐!)是使用工厂。工厂确实会触发回调并允许您使用虚拟属性等。这是因为它们每次都会实例化模型。一种流行的宝石是Factory Girl。另一个可以尝试的是Machinist。我还为此主题创建了Railscasts episode

    【讨论】:

    • +1 给工厂女孩。大约 2 个月前切换到它,我再也没有回头。
    • +1 因为工厂女孩太棒了...花一个小时来学习它,你会很快弥补你失去的时间。
    • 您也可以在用户是您的固定装置的情况下执行类似的操作。 user._run_create_callbacks
    【解决方案2】:

    我也有这个问题。我们的应用程序在 before_save 之前计算了一些总数,因此不必即时完成。加快报告速度并减少某些报告的连接。

    在这些对象的测试中,我们手动运行回调,如下所示:

    before do
      order.perform_callbacks
    end
    

    这很有效,因为它不会一直运行,因此其他测试不会受到影响。

    顺便说一句,我们正在使用 minitest 和固定装置。

    【讨论】:

    • 这段代码在哪里?夹具顶部?什么是秩序?
    • 你好坏蛋。该代码位于我的测试文件的顶部,在 stmt 之前,因为在这种情况下,我需要它用于该文件中的每个测试。如果您只需要确保回调运行 1 次测试,您可以将 .perform_callbacks 放在该特定测试中。
    • 什么是order,一个类,一个实例?奇怪的是,我在任何地方都找不到 perform_callbacks 记录。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-13
    • 2014-01-26
    • 2010-10-09
    • 1970-01-01
    • 2015-10-27
    相关资源
    最近更新 更多