RubyFlow The Ruby and Rails community linklog

UUID primary keys with ActiveRecord in Rails 3

Sometimes it is useful to have primary keys in ActiveRecord that are independent from a database’s autoincrement implementation. With ActiveSupport::Concern this can be done smoothly in Rails 3

Comments

I think it’s worth pointing out that you don’t really need ActiveSupport::Concern for this, it’s just API sugar for the included method in Module. You can just as easily do:

module Extensions module UUID def self.included(base) base.class_eval do set_primary_key 'uuid' before_create :generate_uuid

    def generate_uuid
      self.id = UUIDTools::UUID.random_create.to_s
    end
  end
end   end end </code>

This is functionally the same. If you’re using Rails then using ActiveSupport::Concern is a nice shorthand, I just don’t want anybody to think that they need to install Active Support to do something like this outside of a Rails context.

Is this something you can’t do with Rails 2?

If you decide to use an opinionated framework you should also adopt the possibilities and convention it offers. I think your code is antiquated when applied in a Rails 3 app as the “API sugar” you wrote about also handles module dependencies.

Improve wheels but don’t reinvent square wheels…

a nice solution

Not to rain on anyone’s parade, but it is worth noting that you can use UUIDs as primary-keys with DataMapper. You can even use DataMapper in a Rails 3 or 2 app with dm-rails.

be careful… mysql at least assumes your primary keys are integers and makes a lot of optimizations based on that. doing this could shred the performance of your database. i tried it once and regret it. i think they still haven’t migrated fully off of guids at grockit.

Post a comment

You can use basic HTML markup (e.g. <a>) or Markdown.

As you are not logged in, you will be
directed via GitHub to signup or sign in