定义的STI关系在FactoryBot / lint

时间:2019-06-16 10:14:56

标签: ruby-on-rails-5 factory-bot

嗨,我有以下3种型号:

位置

StagingLocation <位置

我可以通过简单地调用StagingLocation的工厂而不是Location来建立关联以创建有效的Package工厂。按照以下代码:

package_spec.rb:

  describe "package validation" do
let(:package_location) { create(:staging_location) }
it "has a valid factory" do
  expect( create(:package, location: package_location) ).to be_valid
end

但是,这不会通过FactoryBot.lint

1。皮棉在创建位置时引发错误

FactoryBot.define do
  factory :location do
  type { "StagingLocation" }
  name { "Location" + Faker::GreekPhilosophers.unique.name }    
  end
end

引发此错误

  

单表继承机制无法找到子类'0'。出现此错误是因为在继承的情况下,列“类型”保留用于存储类。如果您不希望将其用于存储继承类,请重命名此列,或者覆盖Location.inheritance_column以将另一列用于该信息。 (ActiveRecord :: SubclassNotFound)

2。调用staging_location工厂失败,并显示

  

NoMethodError

因为Package正在寻找位置

FactoryBot.define do
  factory :package do
    staging_location
    name { "TEST-" + rand(99).to_s }
  end
end

我看到了三种可能的方法来解决这个问题,但似乎找不到能够实现它们的FactoryBot语法:

a)创建位置工厂

b)创建一个StagingLocation工厂,该工厂使用base_class方法或类似方法返回Location类。

c)告诉Package工厂接受staging_location作为位置工厂

d)忽略错误,因为在一天结束时,我的工厂正在按预期方式创建。

有什么建议吗?

1 个答案:

答案 0 :(得分:0)

根据this issue,在FactoryBot github页面上,

可以通过在父工厂中声明子工厂并声明STI类来定义STI。

在我的情况下,结果如下:

FactoryBot.define do
  factory :location, class: "StagingLocation" do
    name { "Staging " + rand(99).to_s }    
  end
end

FactoryBot.define do
  factory :package do
    name { "Package " + rand(99).to_s }    
    location { create(:staging_location, location: location) }
  end
end