Rails3中的UUID

时间:2010-03-21 16:45:36

标签: ruby-on-rails

我正在尝试设置我的第一个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

非常感谢任何见解。

感谢。

6 个答案:

答案 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)

答案 5 :(得分:0)

您可以考虑避免使用字符串类型来存储您的UUID,因为它会使查找速度超慢。有'activeuuid' gem看起来很有希望(使用二进制存储)。