4

比較的複雑なモデルの工場を構築しようとしています。

私は Source に属する Pressroom モデルを持っており、Source には多くの Pressroom があります。Source の作成時に pressrooms が空の場合、最初の pressroom が after_create フィルターで作成されます。プレスルームのサイトは、ソースごとに一意である必要があります。

class Source
  has_many :pressrooms
  after_create :create_initial_pressroom! # if pressrooms.empty?
  ...
end

class Pressroom
  belongs_to :source
  # source.pressrooms.map(&:site) should have unique elements
  validate_on_create :check_unique_site
end

これは私の問題につながりPressroom.makeます.プレスルームを持たないソースを構築するため、after_createコールバックが作成Pressroom.makeされ、終了しようとするとそのサイトが一意ではないため、失敗します. 実行時に 2 つのプレスルームを作成したくないPressroom.make

これを解決するための私の試みは、プレスルーム ブループリントのソースの関連付けがプレスルームを参照するようにすることです。どういうことSource.create :pressrooms => [Pressroom.new]だろう。

Pressroom.blueprint do
  source { Source.make :pressrooms => [self] }
  site { source.site }
end

残念ながら、selfまだプレスルームではありません。これは Machinist::Lathe のインスタンスなので、ActiveRecord::AssociationTypeMismatch 例外が発生します。

工場や機械工に関しては、私は少し初心者です。Pressroom.makeビジネスロジックを変更する必要はなく、その過程で 2 つのプレスルームを作成することなく、きれいにプレスルームを作成できるようにしたいと考えています。factory-girl への切り替えが役立つなら、私はそれを受け入れます。

これを解決する方法についてのアイデアに感謝します。

4

2 に答える 2

2

グーグルで調べてみると、 http:after_create :create_initial_pressroom! //webcrisps.wordpress.com/2009/08/13/stubbing-before_create-callbacks-in-a-machinist-blueprint/で、ソースブループリントのソースでコールバックをスタブするためのヒントが見つかりました。 –ここでMachinist 2とMochaを使用します:

Pressroom.blueprint do
  source { Source.make!(:without_initial_pressroom) }
  site   { object.source.site }
end

Source.blueprint do
  site
end

Source.blueprint(:without_initial_pressroom) do
  object.stubs(:create_initial_pressroom!).returns(true)
end

このように、正常にPressroom.make!動作し、正常にSource.make!動作し、そして...私は幸せだと思います。しかし、私が上で試した解決策(機械工1と2の両方)で遭遇した問題にまだ少し当惑しています。

誰かがこれをobjectで動作させる方法を知っているなら、私に知らせてください。それはずっときれいになるでしょう、そしてその上、私は一般的にここでstackoverflowで自分の答えを受け入れるのが好きではありません。

于 2011-03-24T19:01:07.073 に答える
1

Machinist 1 または 2 を使用していますか? Machinist 2 に対するこれらの提案は、Machinist 1 では機能する場合と機能しない場合があります。

あなたが提案している方法でそれを行うには、次を使用する必要がありますobject

Pressroom.blueprint do
  source { Source.make :pressrooms => [object] }
  site { source.site }
end

しかし、より良い方法は、Machinst がモデルの関連付けについて知っているという事実を利用して、そのまま実行させることです。

Pressroom.blueprint do
  source
  site { source.site }
end

関連付けが正しく設定されていると仮定すると、それは機能するはずです。詳細については、Blueprints wiki ページを参照してください。

于 2011-03-24T16:57:21.527 に答える