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:
选项完成其余的工作。
所以我对工厂机器人比较陌生,我将一些旧 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:
选项完成其余的工作。