gem public_uid で id生成先のカラムを指定する方法

3 min read読了の目安(約3000字

TL;DR

gem public_uid

public_uid は 一意なレコード識別子を表すランダム文字列(または乱数)を生成する gem です。

https://github.com/equivalent/public_uid

もっとも簡単な使い方は以下で
こんな migration ファイルで列を追加して

xxxxxxxxxx_add_public_uid_to_users.rb
class AddPublicUidToUsers < ActiveRecord::Migration
  def change
    add_column :users, :public_uid, :string
    add_index  :users, :public_uid
  end
end

こんな感じで Model に追記すればOKです。

user.rb
class User < ActiveRecord::Base
  include PublicUid::ModelConcern
end

include PublicUid::ModelConcern を使用した場合は、様々なヘルパーメソッドも利用できます。

User.find_puid('xxxxxxxx')
# => <#User ...>
User.find_puid('not_existing')
# => nil

User.find_puid!('xxxxxxxx')
# => <#User ...>
User.find_puid!('not_existing')
# PublicUid::RecordNotFound (User 'not_existing' not found)

public_uid という列名を使用したくないとき

例えば guid 列を public_uid な列として扱いたい時は

こんな migration ファイルで列を追加して

xxxxxxxxxx_add_public_uid_to_users.rb
class AddPublicUidToUsers < ActiveRecord::Migration
  def change
    add_column :users, :guid, :string
    add_index  :users, :guid
  end
end

こんな感じで Model に追記すればOKです。
generate_public_uid のオプションで指定してやるんですね

user.rb
class User < ActiveRecord::Base
  generate_public_uid column: :guid
end

この場合は include PublicUid::ModelConcern を使用しないパターンなので
ヘルパーメソッドなどは使用できません。
各々 guid 列で検索したりするメソッドなどを Model に定義しましょう。

generate_public_uid
column: の他にも generator: もオプションに持ち、
generator: には生成するIDの形式を指定してやることができます。
文字列、数字のみ、数字範囲など色々指定出来ます。

# ランダムな整数値
generate_public_uid generator: PublicUid::Generators::NumberRandom.new
# SecureRandom を用いたランダムな整数値
generate_public_uid generator: PublicUid::Generators::NumberSecureRandom.new
# ランダムな16進数文字列
generate_public_uid generator: PublicUid::Generators::HexStringSecureRandom.new
# 使用する文字列と桁数を使ったランダム値
UID_RANGE = ('a'..'z').to_a + ('A'..'Z').to_a + ('0'..'9').to_a
generate_public_uid generator: PublicUid::Generators::RangeString.new(4, UID_RANGE)
# 数値範囲
UID_RANGE = 1_000..4_000
generate_public_uid generator: PublicUid::Generators::NumberRandom.new(UID_RANGE)

Random と SecureRandom の違いはこの記事とかがわかりやすかったです

余談

gem public_uid を使う以外にも、
UUID や ULID を使うのも良いでしょう。

参考