22

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

before_create :create_dependencies
after_create :build_inbox

而且我还有一个 users.yml 文件,其中定义了一堆用户装置。

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

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

2 回答 2

30

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

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

有没有办法在加载夹具时强制触发回调?

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

第二种解决方案(强烈推荐!)是使用工厂。工厂确实会触发回调并允许您使用虚拟属性等。这是因为它们每次都会实例化模型。一种流行的宝石是工厂女孩。另一个要尝试的是机械师。我还创建了一个关于该主题的Railscasts 插曲。

于 2009-08-03T16:07:24.380 回答
3

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

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

before do
  order.perform_callbacks
end

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

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

于 2015-04-08T18:17:19.210 回答