【问题标题】:factory_girl association validationsfactory_girl 协会验证
【发布时间】:2011-01-04 11:08:59
【问题描述】:

我有一个父模型 Foohas_many :barshas_many :bazes。最后,我还有一个连接模型BarBaz,其中belongs_to :barbelongs_to :baz。我想验证所有 bar_bazes,以便它的 bar 和 baz 都属于同一个 foo。但我似乎无法找到一种方法来为这个模型定义一个有效的工厂。

Factory.define(:bar) do |bar|
  bar.association(:foo)
end

Factory.define(:baz) do |baz|
  bar.association(:foo)
end

Factory.define(:bar_baz) do |bar_baz|
  baz_bar.association(:foo)
  baz_bar.association(:bar)
  baz_bar.association(:baz)
end

当我尝试创建后者时,我得到一个无效记录错误,因为 bar 和 baz factory_girl 尝试将它关联起来,每个都有自己的 foo。我是不是搞砸了?

【问题讨论】:

    标签: ruby-on-rails factory-bot


    【解决方案1】:

    因此,经过数小时的努力解决这个问题,我想我终于找到了解决方案。虽然这很疯狂,所以希望其他人仍然可以告诉我我在哪里愚蠢。

    Factory.define :foo do |foo|
    end
    
    Factory.define :bar do |bar|
    end
    
    Factory.define :baz do |baz|
    end
    
    Factory.define :foo_with_baz do |foo|
      foo.after_create { |foo| Factory(:baz, :foo => foo) }
    end
    
    Factory.define :bar_baz do |bar_baz|
      bar_baz.bar {|bar| bar.association(:bar, :foo => Factory(:foo_with_baz))
      bar_baz.after_build {| bar_baz| bar_baz.baz_id = bar_baz.foo.bars.first.id }
    end
    

    关键问题是数据库中需要有一个 foo ,您可以单独通过工厂获取,因为您可以在 factory.rb 中使用局部变量或任意 ruby​​ 代码(据我所知)。

    【讨论】:

    • 嗯,它不可能那么好,因为几个月后我又回来了,我不记得我到底在做什么。 :)
    【解决方案2】:

    创建具有深度嵌套关联的工厂的疯狂导致我创建了fixie,它允许您使用 ActiveRecord 创建测试记录。它在db:test:prepare 步骤期间运行。我用它来消除对固定装置的需求。您可以继续使用工厂来构建更容易构建的对象。

    【讨论】:

    • 我真的很喜欢这样,但为什么我们不能让我们的工厂解决方案允许工厂定义中的任意 Ruby 代码?
    • 在某种程度上可以。您需要解决的技巧是多次调用工厂并且每次都需要生成一个有效对象。这会使关联变得混乱。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多