我是 Ruby & Rails 的新手...目标是创建一个User其主键 (id) 不是整数,而是 GUID。我想我已经正确设置了 ActiveRecord 端(不是自动生成id带类型的列integer,但有柱id类型的string相反),以及一个可以生成 GUID 的函数。
此时唯一缺少的部分是让 Rails 初始化一个新的User类'与id使用我编写的 *generate_guid* 函数。
我的问题: 如何让 Rails 初始化id带有随机 GUID?例如...
@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
感谢建议!
你可以使用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 吗?看起来计算成本确实很高。正如有人评论的那样,请注意,当你脱离常见的模式和约定时,Rails 有时会表现得很奇怪......
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)