views:

498

answers:

3

I'm trying to setup my first Rails3 project and, early on, I'm running into problems with either uuidtools, my UUIDHelper or perhaps callbacks. I'm obviously trying to use UUIDs and (I think) I've set things up as described in Ariejan de Vroom's article. I've tried using the UUID as a primary key and also as simply a supplemental field, but it seems like the UUIDHelper is never being called.

I've read many mentions of callbacks and/or helpers changing in Rails3, but I can't find any specifics that would tell me how to adjust. Here's my setup as it stands at this moment (there have been a few iterations):

# migration
class CreateImages < ActiveRecord::Migration
  def self.up
    create_table :images do |t|
      t.string :uuid, :limit  => 36
      t.string :title
      t.text :description

      t.timestamps
    end
  end
  ...
end

# lib/uuid_helper.rb
require 'rubygems'
require 'uuidtools'

module UUIDHelper
  def before_create()
    self.uuid = UUID.timestamp_create.to_s
  end
end

# models/image.rb
class Image < ActiveRecord::Base
  include UUIDHelper

  ...
end

Any insight would be much appreciated.

Thanks.

A: 

Are you declaring another before_create method in your Image model? If so, you'll be overriding the one in the UUIDHelper module. You'll want to either declare the callback a different manner, or call super in the callback in your image model.

Edit: Maybe change the helper to look something like this:

module UUIDHelper
  def self.included(base)
    base.class_eval do
      before_create :set_uuid

      def set_uuid
        self.uuid = UUID.timestamp_create.to_s
      end
    end
  end
end
PreciousBodilyFluids
This is the only callback of any sort that's being executed at the moment. For the sake of extensibility, I'll definitely make a change once I get this issue figured out and fixed. I didn't realize that a callback in a helper would be overwritten that way, but I guess it makes sense.
Rob Wilkerson
I continue to be disappointed that Rails doesn't offer UUID support natively and Rails3--at least in its current state--doesn't appear to even support the only reasonable "hack" I've found. There is some good information in this response, so I'm going to mark it as the answer unless/until something better comes along.
Rob Wilkerson
+1  A: 

If you get an error "NoMethodError (undefined method `timestamp_create' for UUID:Class)", then change the contents of the set_uuid method to:

self.uuid = UUIDTools::UUID.timestamp_create().to_s

I believe this is necessary for more recent versions of the uuidtools gem.

Stephen Cremin
A: 

I also noticed you're missing the :id => false in your create_table. Check out the example from Ariejan's article a little more closely:

create_table :posts, :id => false do |t|
  t.string :uuid, :limit => 36, :primary => true
end

Additionally, I prefer the UUIDTools::UUID.random_create.to_s to the timestamp version. YMMV.

Tim Shadel