Câu hỏi này là một phần mở rộng của một lớn lên ở đây:FactoryGirl trong Rails - Hội w/chế độc đáo
Using factory_girl in Rails with associations that have unique constraints. Getting duplicate errors
Câu trả lời được cung cấp đã làm việc một cách hoàn hảo đối với tôi. Dưới đây là hình thức:
# 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
Vấn đề nảy sinh khi tôi cần xây dựng liên kết để hỗ trợ liên kết đa hình với ràng buộc duy nhất trong móc. Ví dụ:
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
thực hiện singleton hiện tại của tôi không hỗ trợ gọi FactoryGirl::Singleton.execute(:matchup, :matchupable => bm)
, chỉ FactoryGirl::Singleton.execute(:matchup)
.
Bạn khuyên bạn nên sửa đổi nhà máy singleton để hỗ trợ cuộc gọi như FactoryGirl::Singleton.execute(:matchup, :matchupable => bm)
HOẶC FactoryGirl::Singleton.execute(:matchup)
như thế nào?
Bởi vì ngay bây giờ, mã ở trên sẽ ném lỗi xác thực duy nhất ("Sự kiện đã được thực hiện") mỗi lần móc được chạy trên nhà máy: baseball_matchup. Cuối cùng, đây là những gì cần phải được cố định để không có nhiều hơn một matchup hoặc baseball_matchup trong DB.
phương pháp
tôi nghĩ rằng vấn đề ở đây là khi bạn gọi FactoryGirl.create và có một bản ghi hiện có trong DB (do đó ngoại lệ được nêu ra), singleton sẽ không được trả lại vì chúng tôi không gọi @@ singletons [factory_key ] sau khi giải cứu. – keruilin