夹具会触发模型回调吗?

Posted

技术标签:

【中文标题】夹具会触发模型回调吗?【英文标题】: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】:

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

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

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

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

第二种解决方案(强烈推荐!)是使用工厂。工厂确实会触发回调并允许您使用虚拟属性等。这是因为它们每次都会实例化模型。一种流行的宝石是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 记录。

以上是关于夹具会触发模型回调吗?的主要内容,如果未能解决你的问题,请参考以下文章

我可以在破折号情节回调中使用多个输入,但只有一个触发回调吗?

在 Android 视图模型中的内部网络更改回调时 LiveData 未触发 - Kotlin

如果应用了 css 过渡,为啥动画回调函数会立即触发?

不会触发Mongoid after / before_remove回调

并行编程(Future)

为啥在 php 7 中添加回调类型提示会触发弃用警告