2012-05-03 7 views
24

関連するモデルのアトリビュートを設定するために使用されるファクトリにパラメータを渡したいとします。関連するモデルは工場内で作成されます。FactoryGirlのアソシエーション時に属性を設定する際にパラメータを渡す

私は、ジョインテーブルTxLinkを介して多対多のリンクを持つトランザクションモデルを持っています。 link = FactoryGirl.create(:link_red_to_sub, sub: 10, red: 7)に電話して、2つのトランザクションオブジェクトとその2つをリンクするTxLinkを作成します。

最後にunits: subがあるため、以下の関連行に誤りがあります。エラーは「特性が定義されていません」です。私はunits: { sub }(かっこ付き)を試しましたが、サイコロはありませんでした。

factory_girlで associationヘルパーは、動的プロパティの引数を取ることはできませんが、関連をインスタンス化する動的属性を使用することができます
factory :tx_link do 
    units "9.99" 

    factory :link_red_to_sub do 
     ignore do 
     sub 0 
     red 0 
     end 
     units { red } 

     association :giver, factory: :transaction, units: sub 
     association :taker, factory: :redemption, units: red 
    end 
    end 

答えて

33

しかし、あなたがしたい:

factory :tx_link do 
    units "9.99" 

    factory :link_red_to_sub do 
    transient do 
     sub 0 
     red 0 
    end 
    units { red } 

    giver { create(:transaction, units: sub) } 
    taker { create(:redemption, units: red) } 
    end 
end 

本の唯一の欠点は、ということですとtakerアソシエーションは、tx_linkをビルドしている戦略に関係なく作成戦略を使用します。つまり、attributes_forbuild_stubbedは、tx_link工場で正しく機能しません。

私が提供した例にはバージョン4.5.0が必要です。ビルド間の区別を可能と作成するために、ジョーの答えに拡大

+0

は廃止され無視されます。代わりに、 "一時的な" – hcarreras

23

factory :tx_link do 
    units "9.99" 

    factory :link_red_to_sub do 
    ignore do 
     sub 0 
     red 0 
    end 
    units { red } 

    giver { build(:transaction, units: sub) } 
    taker { build(:redemption, units: red) } 

    after(:create) do |link_red_to_sub| 
     link_red_to_sub.giver.save! 
     link_red_to_sub.taker.save! 
    end 
    end 
end 
関連する問題