I'm trying to setup my first Rails3 project and, early 开发者_StackOverflowon, 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.
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.
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
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.
I had to specify the primary key in my model to make it work at the controller level.
class Image < ActiveRecord::Base
include UUIDHelper
set_primary_key :uuid
...
end
I outline a working UUID example in this question:
Is COMB GUID a good idea with Rails 3.1 if I use GUIDs for primary keys?
Obviously you can rewrite set_uuid any way you want--you don't have to use COMB GUIDs.
Credits: adapted from https://github.com/boriscy/uuidrails3/blob/master/lib/uuid_helper.rb referenced in using UUID as primary key in rails and polymorph relationships. Also found an example at https://github.com/belucid/Recent-Updates/blob/884624e433cdffd63abd24b3bdb516a5d1596173/lib/uuid_helper.rb.
You might consider avoiding the use of string types to store your UUID, as it will make lookups super-slow. There is an 'activeuuid' gem that looks promising (uses binary storage).
加载中,请稍侯......
精彩评论