Ruby On Rails:在“.new”上使用随机GUID初始化对象?

时间:2012-12-02 19:12:39

标签: ruby-on-rails ruby-on-rails-3 activerecord

我是Ruby&的新手Rails ...目标是创建一个用户类,其主键( id )不是整数,而是GUID。我想我已经正确设置了ActiveRecord结尾(不是自动生成类型为整数 id 列,但是类型为 id 取而代之的是 string ,以及一个可以生成GUID的函数。

此时唯一缺少的是使用我编写的* generate_guid *函数让Rails使用 id 初始化一个新的 User 类。

我的问题:如何让Rails使用随机GUID初始化 id ?例如......

@user = User.new
@user.id
> 'AG5CE52' # <-- A randomly generated GUID...

同样重要的是要考虑如果从数据库加载 User 的实例,它不应该更改现有用户的 id ;只有在我第一次创建用户时才会生成GUID。

以下是一些代码示例:

模型

class User < ActiveRecord::Base
  before_create :generate_guid  # This doesn't seem to do anything (when I call User.new)

  set_primary_key :id

  protected

  def generate_guid
    begin
      id = SecureRandom.urlsafe_base64
    end while User.where(:id => id).exists?
    self.id = id
  end
end

迁移

class CreateUsers < ActiveRecord::Migration
  def self.up
    create_table :users, {:id => false} do |t|
      t.string :id
      ...
    end
    execute "ALTER TABLE users ADD PRIMARY KEY (id);"
end

建议表示赞赏!

  • 戴夫

1 个答案:

答案 0 :(得分:4)

您可以使用after_initialize回调,每次实例化类的对象时都会调用该回调。

 class User < ActiveRecord::Base
   after_initialize :generate_guid, unless: :guid
   def generate_guid
     self.guid = # your method here
   end
 end

您还可以将此字段设置为迁移中的主键:

create_table :users, primary_key: :guid do |t| 

但是,每次实例化对象时,是否真的需要创建一个guid?它看起来真的很贵。正如有人评论的那样,当你摆脱常见的模式和惯例时,要警告有轨道有时表现得很奇怪......