gem
GitHub - excid3/prefixed_ids: Friendly Prefixed IDs for your Ruby on Rails models
Friendly Prefixed IDs for your Ruby on Rails models - excid3/prefixed_ids
github.com
概要
StripeのAPIでは各リソースのIDが cus_12345abcd のように プレフィックス+ランダムな文字列 になっています。RailsのモデルのIDをこのような形式で扱うための便利なgemです。
DBのAUTO_INCREMENTな値をIDとしてそのまま使いたくない。でも、UUIDみたいなカラムを追加するのも。。。みたいなときにありがたいですね。GraphQLの場合は、それぞれのリソース毎にグローバルでユニークなIDをつけた方が良いので、そんな時にも使えます。
使い方
-
Gemfileに以下を追加して
bundle installを実行します。Gemfilegem 'prefixed_ids' -
Prefixed IDsのランダムな文字列を生成するためのsaltを設定します。以下のようにすることで、環境変数で設定できるようになります。
bundle exec rails secretなどで生成した文字列を設定しておきましょう。config/initializers/prefixed_ids.rbPrefixedIds.salt = ENV.fetch('PREFIXED_IDS_SALT') -
Prefixed IDsを有効にしたいモデルに以下のように
has_prefix_id :userを追加します。:userの部分はプレフィックスになるのでu_abc123のようにしたい場合は:uにしましょう。app/models/user.rbclass User < ApplicationRecord has_prefix_id :user end -
以上で簡単な設定は終わりです。以下のようにしてレコードを取得できるようになります。
レコードを取得するuser = User.find(1) puts user.id # 1 puts user.prefix_id # user_mX6g41alvDZ9Zu6Ro7AOejE3 user2 = User.find('user_mX6g41alvDZ9Zu6Ro7AOejE3') puts user == user2 # true user3 = PrefixedIds.find('user_mX6g41alvDZ9Zu6Ro7AOejE3') puts user == user3 # true
高度な設定: Model.findメソッドで指定できるIDをどちらか一方にできる
デフォルトでは find で通常のIDとPrefixed IDのどちらを指定してもレコードが取得できますが、どちらか一方に制限することができます。
通常のIDのみにしたい場合
Prefixed
class User < ApplicationRecord
has_prefix_id :user, override_find: false, override_param: false
end
# OK
User.find(1)
# Error
User.find('user_mX6g41alvDZ9Zu6Ro7AOejE3')
# Couldn't find User with 'id'=user_mX6g41alvDZ9Zu6Ro7AOejE3Prefixed IDのみにしたい場合
Prefixed
class User < ApplicationRecord
has_prefix_id :user, override_find: true, override_param: true, fallback: false
end
# OK
User.find('user_mX6g41alvDZ9Zu6Ro7AOejE3')
# Error
User.find(1)
# 1 is not a valid prefix_id