Faker gemを使って単語をランダムに取得する
なにかしらSaaSを使っていると、プロジェクト名とかデータベース名とかある程度意味がわかりつつもランダムな単語でIDなんかを発行してくれるサービスがあります。
frozen-peach-1234
とかhot-lemon-abcd
とかそんな感じのやつ。ただのランダムな文字列よりも親しみが出るし、なんか素敵。
自分が作っているサービスでも同じことをしたいと思って、調べていたらFakerというgemを見つけました。
テストデータを生成する、といった用途で使われることが多いみたいだけれど、プロダクトコードで使っても別にいいと思います。
いつものように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がたくさん置いてありました。これを見れば、目的のジャンルの単語の母数はいくつぐらいなのかがわかっていいですね。
この記事の環境情報
- ruby 3.1.2
- Faker 3.1.0
- 成人の日
Rubyに関する他の記事を読む
- slimでtype='application/ld+json'のscriptタグを書く
- Slack APIによる自動メッセージでユーザーグループにメンションする方法
- RubyでUnixtimeからTimeオブジェクトを生成する
- gemインストール時にUndefined symbols for architecture arm64と出たときの対応
- RubyでUTCの時刻情報をJST基準に変換する
最近の記事を読む
- Flutterでcontextを使わずにlocale情報を取得する
- Cloud RunでIAPを有効にしようとしてハマったこと
- slimでtype='application/ld+json'のscriptタグを書く
- タグマネージャーでjsのloadイベントを発火させたいとき
- mysqlコマンドを実行してERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)と言われたら