StripeのAPIでは各リソースのIDが cus_12345abcd
のように プレフィックス+ランダムな文字列
になっています。RailsのモデルのIDをこのような形式で扱うための便利なgemです。
DBのAUTO_INCREMENTな値をIDとしてそのまま使いたくない。でも、UUIDみたいなカラムを追加するのも。。。みたいなときにありがたいですね。GraphQLの場合は、それぞれのリソース毎にグローバルでユニークなIDをつけた方が良いので、そんな時にも使えます。
Gemfileに以下を追加して bundle install
を実行します。
gem 'prefixed_ids'
Prefixed IDsのランダムな文字列を生成するためのsaltを設定します。以下のようにすることで、環境変数で設定できるようになります。bundle exec rails secret
などで生成した文字列を設定しておきましょう。
PrefixedIds.salt = ENV.fetch('PREFIXED_IDS_SALT')
Prefixed IDsを有効にしたいモデルに以下のように has_prefix_id :user
を追加します。:user
の部分はプレフィックスになるので u_abc123
のようにしたい場合は :u
にしましょう。
class 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
デフォルトでは find
で通常のIDとPrefixed IDのどちらを指定してもレコードが取得できますが、どちらか一方に制限することができます。
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_mX6g41alvDZ9Zu6Ro7AOejE3
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