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

2024-03-27

我是 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

感谢建议!

  • Dave

你可以使用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(使用前将#替换为@)

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

随机推荐

  • 在 WPF (MVVM) 中动态更改窗口的用户控件

    我是新来的WPF我只是用做一个简单的菜单MVVM with bindings and commands但我想我做错了什么 我只想更改所有窗口内容导入新的UserControl我定义了 每次按下菜单按钮时 这意味着我想消失菜单并显示新内容 我
  • mongodb 聚合 $lookup 与查找和填充

    我有一个像这样的视频架构 const VideoSchema new mongoose Schema caption type String trim true maxlength 512 required true owner type
  • 为什么应用程序突然关闭而没有显示任何错误?

    我的应用程序有什么作用 该应用程序正在从照片库中选择一张照片 我的问题是什么 一旦我从图库中选择照片 它就会毫无错误地关闭 我做了什么 我增加了设备的内存 但它不起作用 我把它从项目中取出来 活动运行良好 然后又回到了活动中 主要问题是什么
  • Python Ctypes Null 终止字符串块

    我正在使用 ctypes 实现使用登录创建进程 http msdn microsoft com en us library ms682429 aspx 一切正常 除了我不知道如何处理这一部分 指向新进程的环境块的指针 如果该参数为NULL
  • 如何处理 RxJava 中 Observable 中的 map() 中的异常

    我想做这个 Observable just bitmap map new Func1
  • HttpContext.Current.Request.ServerVariables["HTTP_REFERER"] null

    我正在尝试使用以下代码来获取 global asax session start 中的引用 url HttpContext Current Request ServerVariables HTTP REFERER 我尝试使用Request
  • 将默认 Python 版本从 2.4 更改为 2.6

    我想使用一些需要 Python 的新软件2 6 我们目前都有2 4 and 2 6安装在我们专用的 CentOS 服务器上 如下所示 which python usr local bin python which python2 6 usr
  • Javascript 倒计时每周六上午 11 点

    我有一个请求 要求它看起来与我在这里找到的大多数答案略有不同 我正在寻找一个 Javascript 倒计时时钟 它根据服务器的时钟在每周六上午 11 点重复 但服务器位于 CA 并且时钟需要为 EST 我分叉了另一个时钟作为开始 但是当涉及
  • 方法“train_test_split”中的参数“stratify”(scikit Learn)

    我正在尝试使用train test split来自 scikit Learn 包 但我在参数方面遇到问题stratify 以下是代码 from sklearn import cross validation datasets X iris
  • htmlagilitypack - 删除脚本和样式?

    我使用以下方法从 html 中提取文本 public string getAllText string html string allText try HtmlAgilityPack HtmlDocument document new Ht
  • 在 import 语句之前设置 pythonpath

    我的代码是 import scriptlib abc import scriptlib xyz def foo some operations 但 scriptlib 位于其他目录中 因此我必须将该目录包含在环境变量 PYTHONPATH
  • 运行时检查失败 #0 - ESP 的值未在函数调用中正确保存

    我创建了一个简单的程序 演示了使用多重继承的 Qt 应用程序遇到的运行时错误 继承树如下所示 QGraphicsItem abstract QGraphicsLineItem MyInterface abstract MySubclass
  • jQuery 图像悬停效果

    我正在努力实现这个效果 http stuff maikeldaloo com jq img hover mousescroll swf使用 jQuery 我写了一些代码 但它有错误 移到右下角你就会看到 一探究竟 http stuff ma
  • MySQL 服务器版本,用于在 '('id') 附近使用正确的语法

    当我尝试导入数据库时 出现此错误 您的 SQL 语法有错误 检查与您的 MySQL 服务器版本相对应的手册 了解在 id 附近使用的正确语法 第 4 行 TYPE MyISAM AUTO INCRMENT 6 DROP TABLE IF E
  • Haskell 中的随机数采样序列

    我需要小列表的高斯随机数进行模拟 所以我尝试了以下操作 import System Random seed 10101 gen mkStdGen seed boxMuller mu sigma r1 r2 mu sigma sqrt 2 l
  • 如何在单击按钮时显示自定义对话框

    我希望我的自定义对话框在单击按钮时加载 但这没有发生 我正在使用此网页上的对话框 http jqueryui com dialog default http jqueryui com dialog default 这是我的代码 functi
  • 导入-CSV GroupBy Sum

    我一直试图从 csv 文件获取有意义的输出 原始输入看起来像这样 Col1 Col2 Col3 Col4 a 2 b z a 2 c x a 1 d y e 1 f s e 2 g t h 1 k r 我正在尝试实现以下输出 不包括 col
  • 根据行内容指定动态生成的表名

    我想设置从 gcs 存储桶中的文件读取数据流管道 然后写入 bigquery 表 需要注意的是 要写入的表应根据从 gcs 文件中读取的行的内容来决定 我的问题是 这可能吗 如果是 有人可以给我任何关于如何实现这一目标的提示吗 此外 必须进
  • 在 Java 中生成具有最低特殊字符要求的安全随机密码

    如何在Java中创建一个符合系统长度和字符集要求的随机密码 我必须创建一个长度为 10 14 个字符的随机密码 并且至少包含一个大写字母 一个小写字母和一个特殊字符 不幸的是 一些特殊字符太特殊而无法使用 所以我不能只使用打印的 ASCII
  • Ruby On Rails:在“.new”上使用随机 GUID 初始化对象?

    我是 Ruby Rails 的新手 目标是创建一个User其主键 id 不是整数 而是 GUID 我想我已经正确设置了 ActiveRecord 端 不是自动生成id带类型的列integer 但有柱id类型的string相反 以及一个可以生