ULIDTools is designed to provide a ruby implementation of ULID that takes advantage of their 128-bit compatibility with UUIDs. It's a little heavier weight than the main ruby implementation, and has methods to more easily create and manipulate ULIDs. You can view the project on my GitHub
The ULID is stored internally as a string of bytes. The class has a few methods on it to make creating, manipulating, and storing them easier.
u = ULIDTools.generate
u.raw # => "\x01iANo%pB\xCC\v\xD4N\xBB\xF4#\\"
u.to_s # => "01D50MWVS5E11CR2YM9TXZ88TW"
u.to_uuid # => "0169414e-6f25-7042-cc0b-d44ebbf4235c"
# Sorting also works!
u1 = ULIDTools.generate
sleep 5
u2 = ULIDTools.generate
u2 < u1 # => true
# You can also create ULIDs as if it was a specific time.
# Useful for backfilling indexes
u3 = ULIDTools.at_time(Time.at(728121600))
u3.to_s # => "00N63PVT00M6VD4GJJ6D4G6TMB"
# And ULIDs know their timestamps as well
u3.time # => 1993-01-27 00:00:00 -0800
You can also use a Plain-old-Ruby object in Rails to serialize ULIDs and UUIDs like so:
# Somewhere
class ULIDSerializer
def self.load(uuid)
return nil if uuid.nil?
ULIDTools.parse_uuid(uuid)
end
def self.dump(ulid)
ulid.to_uuid
end
end
# In the Model
class SomeModel < ApplicationRecord
serialize :ulid, ULIDSerializer
end
In fact, I use ULIDs on this site as resource locators for inserting images and links! This page's ULID is 01DE6G74KGGRE4SSP3CG4YTHAC