我是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
建议表示赞赏!
答案 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?它看起来真的很贵。正如有人评论的那样,当你摆脱常见的模式和惯例时,要警告有轨道有时表现得很奇怪......