我正在尝试设置我的第一个Rails3项目,在早期,我遇到了uuidtools
,我的UUIDHelper
或者回调问题。我显然试图使用UUID并且(我认为)我按照Ariejan de Vroom's article中的描述进行了设置。我已经尝试将UUID用作主键,也只是一个补充字段,但似乎永远不会调用UUIDHelper
。
我已经阅读过许多关于Rails3中的回调和/或帮助程序的提及,但我找不到任何可以告诉我如何调整的细节。这是我现在的设置(已经进行了几次迭代):
# 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
非常感谢任何见解。
感谢。
答案 0 :(得分:5)
如果收到错误“NoMethodError(UUID:Class的未定义方法`timestamp_create')”,则将set_uuid方法的内容更改为:
self.uuid = UUIDTools::UUID.timestamp_create().to_s
我认为这对于更新版本的uuidtools gem来说是必要的。
答案 1 :(得分:4)
您是否在Image模型中声明了另一个before_create方法?如果是这样,您将覆盖UUIDHelper模块中的那个。你想要以不同的方式声明回调,或者在图像模型的回调中调用super。
编辑:也许更改帮助器看起来像这样:
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
答案 2 :(得分:1)
我还注意到你错过了:id => false
中的create_table
。请仔细查看Ariejan文章中的示例:
create_table :posts, :id => false do |t|
t.string :uuid, :limit => 36, :primary => true
end
此外,我更喜欢UUIDTools::UUID.random_create.to_s
到时间戳版本。 YMMV。
答案 3 :(得分:1)
我必须在模型中指定主键才能使其在控制器级别工作。
class Image < ActiveRecord::Base
include UUIDHelper
set_primary_key :uuid
...
end
答案 4 :(得分:1)
我在这个问题中概述了一个有效的UUID示例:
Is COMB GUID a good idea with Rails 3.1 if I use GUIDs for primary keys?
显然,您可以以任何方式重写set_uuid
- 您不必使用COMB GUID。
致谢:改编自https://github.com/boriscy/uuidrails3/blob/master/lib/uuid_helper.rb中引用的 using UUID as primary key in rails and polymorph relationships。 还找到了一个例子 https://github.com/belucid/Recent-Updates/blob/884624e433cdffd63abd24b3bdb516a5d1596173/lib/uuid_helper.rb
答案 5 :(得分:0)
您可以考虑避免使用字符串类型来存储您的UUID,因为它会使查找速度超慢。有'activeuuid' gem看起来很有希望(使用二进制存储)。