题
我有一个问题,即我有一个父模型Foo
,其中两个has_many :bars
和has_many :bazes
。最后,我也有一个BarBaz
加入模型belongs_to :bar
和belongs_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
步运行。我用它来消除对灯具的需求。您可以继续使用工厂进行更易于构建对象。
不隶属于 StackOverflow