なにかしらSaaSを使っていると、プロジェクト名とかデータベース名とかある程度意味がわかりつつもランダムな単語でIDなんかを発行してくれるサービスがあります。

frozen-peach-1234とかhot-lemon-abcdとかそんな感じのやつ。ただのランダムな文字列よりも親しみが出るし、なんか素敵。

自分が作っているサービスでも同じことをしたいと思って、調べていたらFakerというgemを見つけました。

テストデータを生成する、といった用途で使われることが多いみたいだけれど、プロダクトコードで使っても別にいいと思います。

Faker

いつものようにGemfileに追加してbundle installでOK。それか、gem install fakerですね。

gem 'faker'

こんな感じでメソッドを実行するとランダムに単語が返ってきます。

Food.spiceの部分は本当に色々あって、単語の種類ごとに豊富にあります。

お好みのジャンルを選べると思います。

irb(main):079:0> Faker::Food.spice
=> "Garlic Granules"

ジャンルによっては日本語対応しているものもあります。Faker.nameなんかがまさにそれ。

railsでFakerを使うとlocaleのデフォルトを見てくれるみたいですが、以下のように指定することで任意のlocaleを設定することも可能です。

# 英語にする
Faker::Config.locale = 'en'

# 日本語にする
Faker::Config.locale = 'ja'

さて、自分の場合はspiceを使うことにしたんだけれど、IDなんかに使用する場合は単語の途中にスペースが入るとよくないです。

あと、最初が大文字なのも微妙。

ということで、以下のようにgsubとdowncaseを使って間に空白ができない かつ 全て小文字にするようにしました。

正規業限のチェックにはこちらのサービスが使えます。

Faker::Food.spice.gsub(/\s/, '_').downcase

これで実行すると以下のような感じ。いい感じです。

irb(main):073:0> Faker::Food.spice.gsub(/\s/, '_').downcase
=> "asafoetida"

irb(main):074:0> Faker::Food.spice.gsub(/\s/, '_').downcase
=> "peppercorns_pink"

irb(main):075:0> Faker::Food.spice.gsub(/\s/, '_').downcase
=> "turmeric_powder"

irb(main):076:0> Faker::Food.spice.gsub(/\s/, '_').downcase
=> "peppercorns_white"

irb(main):077:0> Faker::Food.spice.gsub(/\s/, '_').downcase
=> "nigella"

さらに、ランダム性を出していきたいので以下のようなコードを追加して6桁のランダム文字列も付与するようにしていきます。

SecureRandom.alphanumeric(6).downcase

最終的にはこんな感じ。わかりやすいし、ランダム性も出ていてgood。自分がほしいものになりました。

irb(main):122:0> "#{Faker::Food.spice.gsub(/\s/, '_').downcase}_#{SecureRandom.alphanumeric(6).downcase}"
=> "dill_herb_m2smgn"

ところでこのFakerというgem、どうやって意味のある単語を生成しているんだろうと思って、ソースコードを見てみたら、愚直に辞書ファイルから取得しているみたい。

以下のような感じでyamlがたくさん置いてありました。これを見れば、目的のジャンルの単語の母数はいくつぐらいなのかがわかっていいですね。

こんな感じでyml形式でデータを管理していた

この記事の環境情報

  • ruby 3.1.2
  • Faker 3.1.0
  • 成人の日