Hacker News new | ask | show | jobs
Using UUIDv7 with Ruby on Rails Without PostgreSQL 18 (t27duck.com)
2 points by t27duck 218 days ago
2 comments

The app I work on at my day job uses UUIDs for primary keys. I'm not sure when/if an upgrade to PostgreSQL 18 will happen, but we wanted to take advantage of timestamp-based UUIDv7. Turns out, it's relatively easy to implement in current Rails with PostgreSQL < 18.
Another option is to use `SecureRandom.uuid_v7` like this:

    # app/models/application_record.rb
    class ApplicationRecord < ActiveRecord::Base
      include PrimaryKeyGenerator
    end

    # app/models/concerns/primary_key_generator.rb
    module PrimaryKeyGenerator
      extend ActiveSupport::Concern

      included do
        after_initialize :generate_id
      end

      def generate_id
        return if self.class.attribute_types["id"].type != :uuid
        return if id.present?

        self.id ||= SecureRandom.uuid_v7
      end
    end

This also gives you the advantage of having your PK known before record persisted (maybe it's just me but I like my UUID PKs generated in app instead of db)
The big drawback is if your app also uses bulk sql inserts which bypasses model hooks. By letting the database handle it, all cases are covered.