代码之家  ›  专栏  ›  技术社区  ›  cakeforcerberus

夹具是否触发模型回调?

  •  16
  • cakeforcerberus  · 技术社区  · 15 年前

    假设我在user.rb中有一个带有以下代码的用户模型:

    before_create :create_dependencies
    after_create :build_inbox
    

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

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

    1. 这是预期的工作方式吗?如果是这样,他们为什么要这样设计?
    2. 有没有一种方法可以在加载夹具时强制触发回调?
    2 回复  |  直到 10 年前
        1
  •  22
  •   ryanb    15 年前

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

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

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

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

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

        2
  •  4
  •   jacklin    10 年前

    我也有这个问题。我们的应用程序在保存之前会计算出一些总数,这样就不必在运行中进行计算。使报告更快,并减少某些报告的连接。

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

    before do
      order.perform_callbacks
    end
    

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

    我们使用小型测试和夹具。