我使用Ruby 2.1.1p76和Rails 4.0.4以及Fabrication gem。
是否可以参考目前正在制造的物体?
我有一个Foo类和一个类Bar。我有每个制造商。我的问题是类Foo和Bar中的每一个都包含一个引用另一个类的字段:
class Foo < ActiveRecord::Base
has_many :bars
belongs_to :current_bar, class_name: "Bar"
end
class Bar < ActiveRecord::Base
belongs_to: :foo
end
制作一个,然后另一个然后在我的规格中为第一个设置参考是很麻烦的:
let!( :foo ) { Fabricate( :foo ) }
let!( :bar ) { Fabricate( :bar, foo: foo ) }
before( :each ) do
foo.update( current_bar: bar )
end
我更愿意只是制造一个Foo并制作其current_bar,并且已经参考了Foo I&#39; m制作。我已经阅读了制作宝石文档,但我无法找到任何可行的方法。我可能只是在忽视它。有谁知道如何实现这个目标?
为了完整性 - 制造商:
Fabricator( :foo ) do
current_bar nil
end
Fabricator( :bar ) do
foo
end
答案 0 :(得分:5)
烨。在文档中忽略了它。
您可以在Fabricators中将它们定义为一个块,可选择接收正在制作的对象以及定义的任何瞬态属性的散列。与在Fabricator中工作的任何东西一样,您也可以在调用Fabricate时定义它们,它们将像您期望的那样工作。回调也是可堆叠的,这意味着你可以在制造商中声明多个相同的类型,并且当你继承另一个制造者时它们不会被破坏。
Fabricator(:place) do
before_validation { |place, transients| place.geolocate! }
after_create { |place, transients| Fabricate(:restaurant, place: place) }
end
另外,在我的情况下,我需要使用after_save回调。我可以在制作者的current_bar
对象中设置foo
,但在规范中,current_bar
仍为nil
。 {_ 1}}方法在after_create中不可用(我是ruby的新手,所以我不知道为什么),但它在after_save中可用。调用更新让我走了。
update
现在,我可以根据我的规范制作Fabricator(:foo) do
transient :current_bar_data
after_save { |foo, transients|
bar = Fabricate( :bar, foo: foo, bar_data: transients[ :current_bar_data ] )
foo.update( current_bar: bar )
}
current_bar nil
end
完整版foo
:
current_bar