我有一个问题,即我有一个父模型Foo,其中两个has_many :barshas_many :bazes。最后,我也有一个BarBaz加入模型belongs_to :barbelongs_to :baz。我想验证所有bar_bazes,这样的酒吧和巴兹都属于同一个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

我得到一个无效的记录错误,当我尝试创建后者,因为酒吧和巴兹factory_girl尝试关联它每个人都有自己富。我拧?

有帮助吗?

解决方案

于是打我的头靠在这个问题了几个小时之后,我想我终于有了一个解决方案。这实在是太疯狂了,所以希望别人仍然可以告诉我在哪里,我太傻了。

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已经可以在通过工厂获得孤独,因为你可以在factories.rb使用局部变量或任意Ruby代码(据我可以告诉)。

其他提示

与深度嵌套协会创建工厂的疯狂促使我创建 fixie 它可以让你创建测试使用ActiveRecord记录。它在db:test:prepare步运行。我用它来消除对灯具的需求。您可以继续使用工厂进行更易于构建对象。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top