6

Fooと の両方の親モデルがあるという問題がhas_many :barsありhas_many :bazesます。最後に、モデルBarBazwhichbelongs_to :barbelongs_to :baz. bar と baz の両方が同じ foo に属するように、すべての bar_bazes を検証したいと考えています。しかし、このモデルの有効なファクトリを定義する方法がわかりません。

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 を関連付けようとするためです。私はめちゃくちゃですか?

4

2 に答える 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

重要な問題は、factory.rb でローカル変数または任意の ruby​​ コードを使用できるため (私が知る限り)、データベースに既に foo が存在している必要があるということです。

于 2010-01-13T02:38:51.970 に答える
0

関連付けが深くネストされたファクトリを作成することの狂気は、ActiveRecord を使用してテスト レコードを作成できるようにするFixieを作成することにつながりました。ステップ中に実行されdb:test:prepareます。私はそれを使用して、固定具の必要性を排除します。オブジェクトをより簡単に構築するために、引き続きファクトリを使用できます。

于 2010-01-15T03:37:53.097 に答える