🖥

Ruby | Faker で 重複しないユニークな値を生成する

2023/08/26に公開

Faker 1.7.3 からユニーク値の生成がサポートされたようだ。(素晴らしい)

READMEのTOPにも書かれているので、かなり重要な変更と認識されているようだ。

検証

従来の書き方だと値が重複する。

Array.new(10000) { Faker::Name.name }.uniq.size
=> 9984

unique をつけると重複しない。

Array.new(10000) { Faker::Name.unique.name }.uniq.size
=> 10000

ユニーク値の枯渇とリセット

ユニーク値が尽きると例外が起こる。( method_missing だと。。? )

[23] pry(main)> Faker::Number.unique.number(1)
=> "7"
[24] pry(main)> Faker::Number.unique.number(1)
=> "3"
[25] pry(main)> Faker::Number.unique.number(1)
=> "5"
[26] pry(main)> Faker::Number.unique.number(1)
=> "9"
[27] pry(main)> Faker::Number.unique.number(1)
=> "4"
[28] pry(main)> Faker::Number.unique.number(1)
=> "8"
[29] pry(main)> Faker::Number.unique.number(1)
=> "2"
[30] pry(main)> Faker::Number.unique.number(1)
=> "1"
[31] pry(main)> Faker::Number.unique.number(1)
=> "0"
[32] pry(main)> Faker::Number.unique.number(1)
=> "6"
[33] pry(main)> Faker::Number.unique.number(1)
Faker::UniqueGenerator::RetryLimitExceeded: Faker::UniqueGenerator::RetryLimitExceeded
from /Users/yuma/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/faker-1.7.3/lib/helpers/unique_generator.rb:19:in `method_missing'

リセットするとまた使えるようになる。

[34] pry(main)> Faker::Number.unique.clear
=> {}
[35] pry(main)> Faker::Number.unique.number(1)
=> "4"
[36] pry(main)> Faker::Number.unique.number(1)
=> "8"

環境

  • faker 1.7.3
  • ruby 2.3.0

参考

チャットメンバー募集

何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ

Twitter

https://twitter.com/YumaInaura

公開日時

2017-02-25

Discussion