我遇到一个问题,我有一个父模型Foo
,has_many :bars
和has_many :bazes
。最后,我还有BarBaz
和belongs_to :bar
的联接模型belongs_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。我搞砸了吗?
答案 0 :(得分:5)
因此,经过几个小时的反对这个问题,我想我终于有了解决方案。虽然如此疯狂,所以希望其他人仍能告诉我我愚蠢的地方。
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代码(据我所知)。
答案 1 :(得分:0)
使用深层嵌套关联创建工厂的疯狂导致我创建fixie,它允许您使用ActiveRecord创建测试记录。它在db:test:prepare
步骤中运行。我用它来消除对灯具的需求。您可以继续使用工厂来更容易构建对象。