/wの団体この質問は、ここで提起1を拡張したものです:FactoryGirl - ユニーク制約
Using factory_girl in Rails with associations that have unique constraints. Getting duplicate errors
提供の答えは私のために完璧に取り組んできました。ここでは次のようになります。私は手動でフックで一意性制約を持つ多型の関連付けをサポートするための関連付けを構築する必要がある場合
# Creates a class variable for factories that should be only created once.
module FactoryGirl
class Singleton
@@singletons = {}
def self.execute(factory_key)
begin
@@singletons[factory_key] = FactoryGirl.create(factory_key)
rescue ActiveRecord::RecordInvalid, ActiveRecord::RecordNotUnique
# already in DB so return nil
end
@@singletons[factory_key]
end
end
end
私のために来ている問題があります。たとえば:
class Matchup < ActiveRecord::Base
belongs_to :event
belongs_to :matchupable, :polymorphic => true
validates :event_id, :uniqueness => { :scope => [:matchupable_id, :matchupable_type] }
end
class BaseballMatchup < ActiveRecord::Base
has_one :matchup, :as => :matchupable
end
FactoryGirl.define do
factory :matchup do
event { FactoryGirl::Singleton.execute(:event) }
matchupable { FactoryGirl::Singleton.execute(:baseball_matchup) }
home_team_record '10-5'
away_team_record '9-6'
end
factory :baseball_matchup do
home_pitcher 'Joe Bloe'
home_pitcher_record '21-0'
home_pitcher_era 1.92
home_pitcher_arm 'R'
away_pitcher 'Jack John'
away_pitcher_record '0-21'
away_pitcher_era 9.92
away_pitcher_arm 'R'
after_build do |bm|
bm.matchup = Factory.create(:matchup, :matchupable => bm)
end
end
end
私の現在のシングルトンの実装はFactoryGirl::Singleton.execute(:matchup, :matchupable => bm)
、のみFactoryGirl::Singleton.execute(:matchup)
の呼び出しをサポートしません。
FactoryGirl::Singleton.execute(:matchup, :matchupable => bm)
またはFactoryGirl::Singleton.execute(:matchup)
などのコールをサポートするシングルトンファクトリを変更することをどのようにお勧めしますか?
今のところ、上記のコードはフックがfactory:baseball_matchupで実行されるたびに一意性検証エラー(「Event is already taken」)を投げます。最終的には、DBにmatchupまたはbaseball_matchupが複数存在しないように修正する必要があります。
私はFactoryGirl.createを呼び出してDBに既存のレコードがあるので(例外が発生します)、シングルトンは返されません。@@ singletons [factory_key ]救助後に。 – keruilin