Tech Racho エンジニアの「?」を「!」に。
  • Ruby / Rails関連

SQLite on Railsシリーズ(13)プレフィックス付きのULIDキー(翻訳)

概要

原著者の許諾を得て翻訳・公開いたします。

参考: Rails 8はSQLiteで大幅に強化された「個人が扱えるフレームワーク」(翻訳)|YassLab 株式会社

日本語タイトルは内容に即したものにしました。

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 Oliverprefixed_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に感謝します。

関連記事

SQLite on Railsシリーズ(01)Gitブランチごとにデータベースを切り替える(翻訳)

SQLite on Railsシリーズ(02)SQLiteをチューニングで強化する(翻訳)


CONTACT

TechRachoでは、パートナーシップをご検討いただける方からの
ご連絡をお待ちしております。ぜひお気軽にご意見・ご相談ください。