夹具会触发模型回调吗?

时间:2009-08-03 15:48:36

标签: ruby-on-rails ruby fixtures

假设我在User.rb中有以下代码的用户模型:

before_create :create_dependencies
after_create :build_inbox

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

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

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

2 个答案:

答案 0 :(得分:23)

  

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

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

  

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

不是我知道的。你有几个选择。一种是构建你的灯具,好像回调已经被触发了。也就是说,手动创建回调所需的数据。例如,如果您有一个哈希用户密码的回调,则需要手动哈希密码,然后将该哈希存储在灯具中。

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

答案 1 :(得分:4)

我也有这个问题。我们的应用程序会在before_save之前计算一些总数,因此不必在运行中完成。使报告更快,并在某些报告上删除一些联接。

在对这些对象的测试中,我们手动运行这样的回调:

before do
  order.perform_callbacks
end

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

我们正在使用minitest和fixtures btw。