Last active
February 7, 2020 12:30
-
-
Save rmoriz/937739 to your computer and use it in GitHub Desktop.
UUID primary keys in Rails 3
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# Gemfile | |
… | |
gem 'uuidtools' | |
… |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# db/migrate/20110422210841_create_sites.rb | |
# 1. :id => false | |
# 2. :uuid | |
# | |
class CreateSites < ActiveRecord::Migration | |
def self.up | |
create_table(:sites, :id => false) do |t| | |
t.string :uuid, :limit => 36, :primary => true | |
t.timestamps | |
end | |
end | |
def self.down | |
drop_table :sites | |
end | |
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# app/models/site.rb | |
class Site < ActiveRecord::Base | |
include Extensions::UUID | |
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# app/models/extensions/uuid.rb | |
# | |
module Extensions | |
module UUID | |
extend ActiveSupport::Concern | |
included do | |
# old rails versions | |
set_primary_key 'uuid' | |
# later rails versions, untested: | |
# self.primary_key = 'the_name' | |
before_create :generate_uuid | |
def generate_uuid | |
self.id = UUIDTools::UUID.random_create.to_s | |
end | |
end | |
end | |
end |
If you are using Ruby 1.9.3+ you can just call SecureRandom.uuid
. You also don't need gem 'uuidtools'
.
Thanks for this.
For Rails 3.1+ check ActiveUUID
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
@warmwaffles you should probably read more about UUIDs and primary key uniqueness ;-)
When possible and you don't mind the database lock-in, do it in the database.
Sometimes, when you have an async API that pushes customer data e.g. on a MQ/redis. You need to generate and return the UUID on the customer-facing system. You can't wait/block for the full, async database round-trip.