🐙
gem public_uid で id生成先のカラムを指定する方法
TL;DR
- README.md をちゃんと読めば書いてある
- equivalent / public_uid | GitHub
generate_public_uid column: :guid
- https://github.com/equivalent/public_uid
- 実装はソースコードを読めばわかる
- public_uid/lib/public_uid/model.rb | GitHub
gem public_uid
public_uid は 一意なレコード識別子を表すランダム文字列(または乱数)を生成する gem です。
もっとも簡単な使い方は以下で
こんな 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 の違いはこの記事とかがわかりやすかったです
- RubyのSecureRandomの乱数生成の実装を読んでみた | note
余談
gem public_uid を使う以外にも、
UUID や ULID を使うのも良いでしょう。
- Rails の UUIDプライマリキーを試す | Qiita
- Rails:モデルのIDにUUIDを使って玄人感を出す | もふもふ技術部
参考
- 【Rails】URLでidの代わりにランダムな文字列を表示させる | Qiita
- 【Rails6】deviseで会員登録時に乱数(ランダムな文字列)を生成 | ASAL
- 【Rails】ランダムな文字列をPrimary keyとして使う | Qiita
- public_uid を使わずにやるパターン
- https://qiita.com/at-946/items/f495442a8a9bfdae5a6b
Discussion