🖥
Ruby | Faker で 重複しないユニークな値を生成する
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オープンチャットもご利用ください。
公開日時
2017-02-25
Discussion