2017-08-03 17 views
0

すでに存在するアソシエーションを割り当てる正しい方法は何ですか?FactoryGirlアソシエーション重複キーエラー

ユーザーと都市の間にhas_one関係を割り当てようとしています。ここでは、同じ都市を多くのユーザーや他のエンティティ(イベントなど)で使用できます。

コード

FactoryGirl.define do 
    factory :user do 
    name 'john' 

    trait :in_boston do 
     association :city, factory: :boston 
    end 
    end 
end 

エラー

PG :: UniqueViolation:ERROR:データベースに二回ボストンを作成しようとしているので、重複するキー値が一意性制約 "city_pkey" を違反しています。

私がしたいのは、既存の工場を参照するだけで、新しい工場を作成することではありません。

私の現在の作業(しかし、理想的な未満)ソリューション

FactoryGirl.define do 
    factory :user do 
    name 'john' 

    trait :in_boston do 
     after(:create) do |user| 
     user.city = City.find_by_name('Boston') || create(:boston) 
     end 
    end 
    end 
end 

どれ指導をいただければ幸いです、ありがとう。

答えて

0

私はあなたのモデルコードがゴールデンであると仮定し、テストをセットアップする方法を示します。都市が存在するかどうかに基づいて、意思決定力を持つ工場がなぜ必要なのかは分かりません。自社の工場で街をインスタンシエートし、テストセットアップでアソシエーションに電話をかけるだけです。

工場

# factories/cities.rb 
FactoryGirl.define do 
    factory :city do 
    name 'Boston' 
    end 
end 

# factories/users.rb 
FactoryGirl.define do 
    factory :user do 
    name 'john' 
    city 
    end 
end 

テスト

describe 'blah' do 
    let(:city){ create :city } 
    let(:user){ create :user, city: city } 

    it 'user should have a city' do 
    expect(user.city.name).to eq 'Boston' 
    end 
end 
関連する問題