Factory_girl关联验证

6

我有一个问题,我有一个父模型Foo,它既has_many :bars,又has_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关联起来。我该怎么办?
2个回答

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代码(据我所知)。


嗯,它可能不是那么好,因为几个月后回来看它时,我都不记得自己在干什么了。 :) - tfwright

0

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


我真的很喜欢这个,但为什么我们不能让我们的工厂解决方案允许在工厂定义中使用任意的Ruby代码呢? - tfwright
你在某种程度上是可以做到的。你需要解决的问题是工厂被多次调用并且每次都需要生成一个有效的对象,这在关联方面会变得混乱。 - Luke Francl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接