Ruby on rails 工厂女孩&x2013;从多态关联中的其他工厂检索属性

Ruby on rails 工厂女孩&x2013;从多态关联中的其他工厂检索属性,ruby-on-rails,polymorphism,associations,factory-bot,belongs-to,Ruby On Rails,Polymorphism,Associations,Factory Bot,Belongs To,我有一块板,属于艺术家。到目前为止,我能够在我的boards factory中设置此多态关联,如下所示: FactoryGirl.define do factory :board do association :boardable, factory: :artist boardable_type "Artist" end end 我在实际应用程序中设置的图案要求我的板的名称为它所属的艺术家的名称。我试过这样做: name boardable.name 但最终得到了这个

我有一块
,属于
艺术家
。到目前为止,我能够在我的boards factory中设置此多态关联,如下所示:

FactoryGirl.define do
  factory :board do
    association :boardable, factory: :artist
    boardable_type "Artist"
  end
end
我在实际应用程序中设置的图案要求我的板的
名称
为它所属的艺术家的名称。我试过这样做:

name boardable.name
但最终得到了这个错误:

ArgumentError: Trait not registered: boardable

关联中检索属性的最佳方法通常是什么?

多态关联不需要在FactoryGirl中声明显式的
关联。以下各项已得到验证,并将发挥作用:

FactoryGirl.define do
  factory :board do
    boardable factory: :artist
    name { boardable.name }
  end
end

就您的
板的名称而言,请确保将属性值括在括号中,否则FactoryGirl可能会将其视为特征:)您的
板的
可板类型
属性将自动设置为
可板的类,因此它甚至不需要声明

多态关联不需要在FactoryGirl中声明显式的
关联。以下各项已得到验证,并将发挥作用:

FactoryGirl.define do
  factory :board do
    boardable factory: :artist
    name { boardable.name }
  end
end

就您的
板的名称而言,请确保将属性值括在括号中,否则FactoryGirl可能会将其视为特征:)您的
板的
可板类型
属性将自动设置为
可板的类,因此它甚至不需要声明

您可以使用before:create。像这样的

FactoryGirl.define do
  factory :board do
    ...
    before(:create) do |board, evaluator|
      # create artist factory here to associate board to
      # example below that isn't polymorphic but you get the idea
      FactoryGirl.create(:artist, name: "foo").boards << board
    end
  end
end
FactoryGirl.define do
工厂:板做
...
在(:create)do | board之前,评估者|
#在此处创建艺术家工厂,将董事会与
#下面的例子不是多态性的,但你明白了

FactoryGirl.create(:artist,name:“foo”).boards您可以使用before:create。像这样的

FactoryGirl.define do
  factory :board do
    ...
    before(:create) do |board, evaluator|
      # create artist factory here to associate board to
      # example below that isn't polymorphic but you get the idea
      FactoryGirl.create(:artist, name: "foo").boards << board
    end
  end
end
FactoryGirl.define do
工厂:板做
...
在(:create)do | board之前,评估者|
#在此处创建艺术家工厂,将董事会与
#下面的例子不是多态性的,但你明白了


FactoryGirl.create(:艺术家,名字:“foo”)。谢谢。没有办法将内容保留在boards factory中?使用更新的答案,name属性到哪里去了?您甚至可以将
name boardable.name
作为factory块中的一个正常特征放置。我在打电话,因此无法测试。您的主要问题是在您的关系定义中包含
关联
。它似乎没有实例化名称,因为我遇到了状态验证错误。上次更新似乎成功了!非常感谢你在这件事上的帮助。非常感谢。谢谢。没有办法将内容保留在boards factory中?使用更新的答案,name属性到哪里去了?您甚至可以将
name boardable.name
作为factory块中的一个正常特征放置。我在打电话,因此无法测试。您的主要问题是在您的关系定义中包含
关联
。它似乎没有实例化名称,因为我遇到了状态验证错误。上次更新似乎成功了!非常感谢你在这件事上的帮助。非常感谢。这段代码在完全成熟的测试套件中运行时速度会非常慢。没有比这更快的替代方案了吗?@Collin Graves,请解释一下为什么您认为这会比您回答中的after(:build)慢。我很怀疑这段代码在“完全成熟的测试套件”中运行时速度会非常慢。我已经做了很多次了,但都没有issues@MilesStanfield我应该提到的是,它有一个艺术家有一个董事会的
协会。设置会有多大的不同?当在一个完整的测试套件中运行时,这段代码会非常慢。没有比这更快的选择了吗?@Collin Graves,请解释为什么你认为这会比你回答中的after(:build)运行得慢。我很怀疑这段代码在测试套件中运行时会非常慢“完全成熟的测试套件”。我已经做了很多次了,但没有issues@MilesStanfield我应该提到的是,它有一个艺术家有一个董事会的
协会。设置会有什么不同?