FactoryBot:多级关联?

FactoryBot: Multi-Level associations?

所以我对工厂机器人比较陌生,我将一些旧 php 代码的模态拉入 rails。而且我似乎 运行 遇到了一个特定工厂创建的问题。

现在这是我的基本 factories.rb 文件:

FactoryBot.define做

factory :"Core/User" do
  username {"jDoe"}
end

factory :"Core/Sex" do
  title {"Unspecified"}
  abbreviation {"U"}
end

factory :"Core/Contact" do
  first_name {"John"}
  last_name {"Doe"}
  display_phone_mobile {false}
  internal {false}
  archive {false}
  "Core/Sex"
end

factory :"Core/Employee" do
  "Core/User"
  "Core/Contact"
  username {"jDoe"}
end

结束

现在还很基础,因为架构有点乱。无论如何,无论出于何种原因,一切正常,直到我开始尝试创建一个“员工”(旁注:我必须将 Core:: 添加到所有内容中,并且必须搜索 SO 以找出如何将其添加到符号中,因为它们我猜是命名空间?(我知道我需要使用 Core::<Model> 来访问 rails fwiw 中的模型)

反正模型比较复杂,重要的部分在这里:

Contact.rb:

  class Core::Contact < Core::BaseModel
  self.primary_key = 'id'
  has_one :employee
  belongs_to :sex

User.rb:

  class Core::User <  Core::BaseModel
  extend Core::ActiveDirectory
  self.primary_key = 'id'

  has_one :employee

Employee.rb:

class Core::Employee < Core::BaseModel
  include ActionView::Helpers::DateHelper

  self.primary_key = 'id'

  belongs_to :contact

还有大量其他依赖项需要解决......但无论出于何种原因,协会在招聘员工时似乎都没有加入 contact_id。因为它特别抱怨 TinyTds::Error: Cannot insert the value NULL into column 'contact_id'

事实是,所有其他的都工作得很好。 IE:如果我创建一个联系人,它会拉入“Core/Sex”,然后我手动创建“联系人”工厂并专门拉入 ID,如下所示:

@contact = create(:"Core/Contact")
puts @contact.attributes
@employee = create(:"Core/Employee", contact_id: @contact.id)

有效!,但我不知道为什么其他协会被拉进来就好了?有什么想法吗?

你不需要那个;你只是将工厂称为 one-word 东西,然后工厂构造函数上有一个 class: 选项

把你所有的工厂都改成标准名称

factory :employee, class: "Core::Employee" do
  user { create(:user) }
  contact { create (:contact) }
  username {"jDoe"}
end

当您将它们称为工厂时,只需使用带符号的短名称,让 class: 选项完成其余的工作。