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
方法中,在工厂名称之后传递的任何参数都将被传入以覆盖工厂内的任何默认值