Ruby on rails Factorybot,创建记录公共多态关系
如何Ruby on rails Factorybot,创建记录公共多态关系,ruby-on-rails,ruby,factory-bot,ruby-on-rails-5.2,Ruby On Rails,Ruby,Factory Bot,Ruby On Rails 5.2,如何创建(:列表,:for_car)和创建(:firm,:for_car),但允许它们拥有相同的通用汽车记录 理想情况下,我想做create(:listing)并让它创建、用户、然后是汽车(属于用户)、上市(属于汽车),然后是公司(属于汽车)。在本例中,Car是相同的精确记录,而不是两个不同的Car记录 因此,我不必调用多个create方法。我怎样才能做到这一点 FactoryBot.define do factory :user, class: "User" do email {
创建(:列表,:for_car)
和创建(:firm,:for_car)
,但允许它们拥有相同的通用汽车记录
理想情况下,我想做create(:listing)
并让它创建、用户、然后是汽车(属于用户)、上市(属于汽车),然后是公司(属于汽车)。在本例中,Car是相同的精确记录,而不是两个不同的Car记录
因此,我不必调用多个create
方法。我怎样才能做到这一点
FactoryBot.define do
factory :user, class: "User" do
email { Faker::Internet.email }
password { "bla" }
password_confirmation { "bla" }
end
factory :car, class: "Car" do
color { "black" }
association :user, factory: :user
end
factory :truck, class: "Truck" do
size { "15" }
association :user, factory: :user
end
factory :bike, class: "Bike" do
style { "road" }
association :user, factory: :user
end
factory :listing, class: "Listing" do
for_car # default
trait :for_car do
association :listable, factory: :car
end
trait :for_truck do
association :listable, factory: :car
end
trait :for_bike do
association :listable, factory: :car
end
end
factory :firm, class: "Firm" do
for_car # default
trait :for_car do
association :listable, factory: :car
end
trait :for_truck do
association :listable, factory: :car
end
trait :for_bike do
association :listable, factory: :car
end
end
factory :store, class: "Store" do
for_car # default
trait :for_car do
association :listable, factory: :car
end
trait :for_truck do
association :listable, factory: :car
end
trait :for_bike do
association :listable, factory: :car
end
end
end
你可以这样做: car_factory.rb
FactoryBot.define do
工厂:汽车,类别:汽车
颜色{“黑色”}
用户
结束
结束
(注意,您不需要使用这种冗长的语法)
清单2.rb
FactoryBot.define do
工厂:列表,类:“列表”do
汽车
结束
结束
这是假设列表中有一个名为car
的字段。FactoryBot可以在此场景中为您找到合适的工厂
然后,在等级库中,您可以像这样覆盖默认值:
let(:car){create(:car)}
让(:truck){create(:truck)}
let(:car_listing){create(:listing)}
let(:truck_listing){create(:listing,car:truck)}
在create
方法中,在工厂名称之后传递的任何参数都将被传入以覆盖工厂内的任何默认值