在factorygirl中,在初始化field2时以任何方式引用field1的值?

jpw*_*ynn 13 ruby-on-rails factory-bot

在工厂中,如何引用正在创建的对象中的其他字段之一的值?

假设我的模型Widget有两个字段,nicknamefullname

在我的工厂里面,我想使用Faker在每次创建工厂时创建一个不同的随机昵称.(最后想通了我必须使用sequence(:nickname),否则所有工厂的名称都是一样的.)

为了使一些断言更容易测试,我想生成一个基于昵称的全名,类似于 fullname = "Full name for #{nickname}"

FactoryGirl.define do
  factory :widget do 
    sequence(:nickname) { |n| Faker::Lorem.words(2).join(' ') }
    sequence(:fullname) { |n| "Full name for " + ????? }
  end
end
Run Code Online (Sandbox Code Playgroud)

无论我把它放在哪里??? 去吧,我得到的#<FactoryGirl::Decl...不是昵称所设置的.

我尝试过name,name.to_s,name.value ......似乎没什么用.

Jas*_*ett 17

是.以下是Factory Girl的入门文档示例:

factory :user do
  first_name "Joe"
  last_name  "Blow"
  email { "#{first_name}.#{last_name}@example.com".downcase }
end

FactoryGirl.create(:user, last_name: "Doe").email
# => "joe.doe@example.com"
Run Code Online (Sandbox Code Playgroud)

另外,我通常分别定义我的序列config/application.rb:

FactoryGirl.define do
  sequence(:random_string) { |s| ('a'..'z').to_a.shuffle[0, 30].join }
end
Run Code Online (Sandbox Code Playgroud)

你也可以从中做同样的事情.然后你可以做类似的事情:

FactoryGirl.define do
  factory :widget do 
    nickname generate(:name_faker) # assuming you had defined a :name_faker sequence
    fullname generate("Full name for #{nickname}")
  end
end
Run Code Online (Sandbox Code Playgroud)