SQLite on Railsシリーズ(13)プレフィックス付きのULIDキー(翻訳)
SQLiteを使うRailsアプリでカスタム主キーを使う方法について書いたことがありました。
本記事では、同じsqlite-ulid
拡張機能でプレフィックス付きのULIDを作成する方法を解説します。issue #5でこれを提案してくれたAndy Stewartに感謝します。
前回の記事では、SQLiteを使っているRailsアプリケーションにカスタム主キーのサポートを追加する新機能(#49290)を用いると、Alex Garciaのsqlite-ulid
拡張機能をRuby gem経由で接続してULIDを主キーとして利用できることを説明しました。
Andy Stewartの指摘によると、sqlite-ulid
拡張機能が プレフィックス付き ULIDもサポートしているため、この関数を使えばChris Oliverのprefixed_ids
gemの振る舞いを模倣できます。
以下はAndyによる方法です。
- Rails 7.1アプリケーションを元にした。
- activerecord-enhancedsqlite3-adapter gemをインストールする。
- このリポジトリのsqlite-ulid gemをインストールしてから、ここに書かれている通りにデータベース設定を更新する。
- これらを行うために以下のようなマイグレーションを書いた。
create_table :things, id: false do |t| t.primary_key :id, :string, default: -> { "ULID_WITH_PREFIX('thing')" } t.belongs_to :widget, null: false, foreign_key: true, type: :string end
全体的に手間のかからない簡単な手順です:)
プレフィックス付きIDに関する私の唯一の経験は、PostgreSQLを使うRailsアプリで@excidの
prefixed_ids
gem を使ったときです。これはうまく動きましたが、モデルにコードを挿入する必要があり、アプリケーションコードが少なくともそれを少しは認識している必要があります(特殊なfinderメソッドなど)。2つのアプローチを比較すると、ID生成をモデルではなくデータベースで処理する方がはるかに好ましいでしょう。アプリケーションコードはモデルのIDについて何も知る必要がないので、はるかに簡単です(私の目的にとって、ULIDはハッシュIDと同等かそれ以上に優れているようです)。
How to use ulid_with_prefix()? · Issue #5 · asg017/sqlite-ulidより
私もAndyの評価に同意します。ID生成をデータベースで処理する方がシンプルでパフォーマンスも高くなるので好みです。これは、SQLiteとその拡張機能エコシステム、およびRailsがSQLiteサポート用に追加している新機能(もしくは現在 activerecord-enhancedsqlite3-adapter
gemにのみ追加されている新機能)を採用すると素晴らしい柔軟性を得られる例です。
RailsとSQLiteでプレフィックス付きULIDを利用する優れた方法をまとめてくれたAndyに感謝します。
概要
原著者の許諾を得て翻訳・公開いたします。
参考: Rails 8はSQLiteで大幅に強化された「個人が扱えるフレームワーク」(翻訳)|YassLab 株式会社
日本語タイトルは内容に即したものにしました。