Faker gem을 사용하여 일부 가짜 데이터를 팩토리에 채우려 고합니다.
Factory.define :user do |user|
user.first_name Faker::Name::first_name
user.last_name Faker::Name::last_name
user.sequence(:email) {|n| "user#{n}@blow.com" }
end
그러나 이것이 first_name과 last_names가 다른 사용자를 생성 할 것으로 예상하지만 각각은 동일합니다.
>> Factory(:user)
=> #<User id: 16, email: "user7@blow.com", created_at: "2011-03-18 18:29:33",
updated_at: "2011-03-18 18:29:33", first_name: "Bailey", last_name: "Durgan">
>> Factory(:user)
=> #<User id: 17, email: "user8@blow.com", created_at: "2011-03-18 18:29:39",
updated_at: "2011-03-18 18:29:39", first_name: "Bailey", last_name: "Durgan">
Faker gem을 사용하여 원래 이름 만 재사용하지 않고 각 사용자의 새 이름을 생성하려면 어떻게해야합니까?
답변
Factory.define :user do |user|
user.first_name { Faker::Name::first_name }
user.last_name { Faker::Name::last_name }
user.sequence(:email) {|n| "user#{n}@blow.com" }
end
가짜 주위에 괄호를 두십시오. 이 링크 참조
답변
Faker는 사용 가능한 가짜 데이터의 양이 제한되어 있기 때문에 여전히 중복 데이터를 제공 할 수 있습니다.
간단한 테스트 목적과 고유성 검증을 위해 다음을 사용했습니다.
sequence(:first_name) {|n| Faker::Name::first_name + " (#{n})"}
sequence(:last_name) {|n| Faker::Name::last_name + " (#{n})"}
답변
정답을 유지하기 위해 여기 블로그에서 옮겨 왔으며 답변에 대한 신용을 인정하지 않습니다.
아래 코드를 사용하면 faker가 고유 한 이름을 생성하지 않습니다.
Factory.define :user do |u|
u.first_name Faker::Name.first_name
u.last_name Faker::Name.last_name
end
그러나 faker 주위에 중괄호를두면 작동합니다!
Factory.define :user do |u|
u.first_name { Faker::Name.first_name }
u.last_name { Faker::Name.last_name }
end
이유를 설명하기 위해 첫 번째 예는 동일한 이름을 생성하는 것입니다. 한 번만 평가합니다. 두 번째 예는 공장이 사용될 때마다 평가합니다.
이는 {}
게으른 평가를 제공 하기 때문 입니다. 본질적으로 그들은 Faker 호출과 함께 proc / lambda를 반환 값으로 제공합니다.
답변
속성에 대한 고유성 유효성 검사가있을 때 시퀀스를 사용하는 것의 (비효율적) 대안은 제안 된 값이 이미 존재하는지 확인하고 고유 할 때까지 새 값을 계속 시도하는 것입니다.
FactoryGirl.define do
factory :company do
name do
loop do
possible_name = Faker::Company.name
break possible_name unless Company.exists?(name: possible_name)
end
end
end
end
답변
