13

我有这个例子

FactoryGirl.define do
  @site = FactoryGirl.create(:my_site)
  factory :user do
    email               { Faker::Internet.email }
    first_name          { Faker::Name.first_name }
    last_name           { Faker::Name.last_name }
    password            { 'TarXlrOPfaokNOzls2U8' }
    active_directory    { '0' }
    companies           { [FactoryGirl.create(:company, site: @site)] }
    sites               { [@site] }
  end
end

有没有办法通过让或其他东西来实现这一点......

FactoryGirl.define do
  factory :user do
    email               { Faker::Internet.email }
    first_name          { Faker::Name.first_name }
    last_name           { Faker::Name.last_name }
    password            { 'TarXlrOPfaokNOzls2U8' }
    active_directory    { '0' }
    companies           { [FactoryGirl.create(:company, site: FactoryGirl.create(:my_site))] }
    sites               { [FactoryGirl.create(:my_site)] }

  end
end

这有效,但它创建了两个 my_site 这是一个 Site 对象,但我需要它们相同......关于如何实现这一点的任何想法

4

2 回答 2

23

可能最简单的是使用局部变量:

FactoryGirl.define do
  site = FactoryGirl.create(:my_site)

  factory :user do
    email               { Faker::Internet.email }
    first_name          { Faker::Name.first_name }
    last_name           { Faker::Name.last_name }
    password            { 'TarXlrOPfaokNOzls2U8' }
    active_directory    { '0' }
    companies           { [FactoryGirl.create(:company, site: site)] }
    sites               { [site] }
  end
end
于 2012-07-06T15:07:35.997 回答
4

我终于想出了一个好方法来做到这一点。这个问题已经很老了,但我想我会发布一个答案,以防其他人遇到这个问题。

您可以使用before(:create)回调(或者before(:build)如果那是您的用例)来设置sites集合,然后将网站集合的第一个元素分配给公司集合中新创建的公司。

可以在此处找到有关 FactoryBot 回调的更多信息。

只是让读者知道,我不推荐使用新的FactoryBot类名FactoryGirl

FactoryBot.define do
  factory :user do
    email               { Faker::Internet.email }
    first_name          { Faker::Name.first_name }
    last_name           { Faker::Name.last_name }
    password            { 'TarXlrOPfaokNOzls2U8' }
    active_directory    { '0' }

    before(:create) do |user|
      user.sites << FactoryBot.create(:my_site)
      user.companies << FactoryBot.create(:company, site: user.sites.first)
    end
  end
end
于 2018-04-20T14:41:31.757 回答