rails_type_id
A gem that makes simple to use TypeID as the primary key for ActiveRecord models.
Installation
Install the gem and add to the application's Gemfile by executing:
bundle add rails_type_idUsage
Database requirements
- ActiveRecord models should have an
idfield that is either a string-like type (TEXT,VARCHAR) . See Migration if you have an existingidfield.
Declaring on models
Add RailsTypeId::Concern to the model. This model's id field should have a string-like database column type.
# app/models/my_model.rb
require "rails_type_id"
class MyModel < ActiveRecord::Base
include RailsTypeId::Concern
# Prefix should be unique within your project
with_type_id_prefix("mm")
endUsing the type_id field
Model instances will have a type_id field of type TypeID.
my_model = MyModel.create!(..)
my_model.id #=> "mm_01k1kzwngff50tfvc4e9hsrype"
my_model.type_id #=> #<TypeID mm_01k1kzwngff50tfvc4e9hsrype>Testing
lib/rails_type_id/test_helpers.rb contains some helper methods for writing wholesome tests.
Migrating existing IDs
For models with an existing Rails id field (usually an auto-incrementing integer), you'll need to
migrate these to either a string-like column type. Below is an example migration for SQLite
using a text type for a Users model that has an associated Session.
class MigrateUserToUUID < ActiveRecord::Migration[8.0]
def change
add_column :users, :uuid, :text, null: true
add_column :sessions, :user_uuid, :text, null: true
Users.find_each do |u|
u.update(uuid: RailsTypeId::Concern::Helpers.generate_type_id("user"))
end
Session.find_each do |s|
s.update(user_uuid: s.user.uuid)
end
change_column_null :users, :uuid, false
change_column_null :sessions, :user_uuid, false
remove_foreign_key :sessions, :users
rename_column :users, :id, :integer_id
rename_column :users, :uuid, :id
rename_column :sessions, :user_id, :integer_user_id
rename_column :sessions, :user_uuid, :user_id
change_column_null :session, :integer_user_id, true
execute "ALTER TABLE users DROP CONSTRAINT users_pkey;"
execute "ALTER_TABLE users ADD PRIMARY KEY (id);"
execute "ALTER TABLE ONLY users ALTER COLUMN integer_id DROP DEFAULT"
change_column_null :users, :integer_id, true
execute "DROP SEQUENCE IF EXISTS users_id_seq"
add_foreign_key :sessions, :users
end
endDevelopment
After checking out the repo, run bin/setup to install dependencies. Then, run rake test to run the tests. You can also run bin/console for an interactive prompt that will allow you to experiment.
To install this gem onto your local machine, run bundle exec rake install. To release a new version, update the version number in version.rb, and then run bundle exec rake release, which will create a git tag for the version, push git commits and the created tag, and push the .gem file to rubygems.org.
Release
To cut a new release of this gem to Rubygems:
- Create a release branch:
release-X.Y.Z - Change the version
X.Y.Zto match inlib/rails_type_id/version.rb. gh release create vX.Y.Z --target release-X.Y.Z