Rails + UUID 生成的模式假定 UUID 是整数而不是字符串

Posted

技术标签:

【中文标题】Rails + UUID 生成的模式假定 UUID 是整数而不是字符串【英文标题】:Rails + UUID generated schema assumes UUID is an integer rather than a string 【发布时间】:2011-01-24 13:37:41 【问题描述】:

我正在尝试使用 UUID 作为 Rails 应用程序的主键,但遇到一个又一个问题。

我在迁移中指定: create_table :users, :id => false do |t| 那么这个: 执行(“ALTER TABLE用户添加主键(uuid)”)

在我的用户模型中: set_primary_key "uuid"

使用 UUID 工具生成 UUID。

这一切都很好,我目前遇到的问题是生成的 schema.rb 看起来像这样:

create_table "users", :primary_key => "uuid", :force => true do |t|

假设主键列是 11 个字符的整数而不是 36 个字符的字符串,因此运行迁移会生成正确的数据库,但会错误地生成测试数据库,如果我要运行 rake db:schema:load,它也会失败...

需要弄清楚如何覆盖 schema.rb 假设如果有一个主键列,它将是一个整数....

【问题讨论】:

【参考方案1】:

我遇到了这个问题。据我所知,不可能覆盖 Rails 要求 PK 为整数的要求。我绕过这个的方法是在数据库中添加一个唯一键,然后在每个模型上设置我的默认范围,以通过我的唯一字符串而不是常规整数进行搜索

【讨论】:

【参考方案2】:

我们长期以来一直使用UUID作为主键(目前使用Rails 3.0.0),但到目前为止还没有找到让Schema dumper明白没有整数id的方法。

因此,我们的解决方案是在需要时手动修复架构。例如总是在rake db:migrate 之后。 :D

我们只是换行

create_table "people", :force => true do |t|

create_table "people", :id => false, :force => true do |t|

t.string   "id", :limit => 22,  :null => false

这很烦人,但一切正常。所以问题不在于 Rails 不允许 UUID 主键,而是模式转储器不理解这些。

【讨论】:

【参考方案3】:

我认为最好的方法是从在 Ruby (schema.rb) 中管理架构切换到在 SQL (development_structure.sql) 中管理架构。

为此:

    在application.rb中设置config.active_record.schema_format = :sql 删除您的 schema.rb 文件。 每次运行rake db:migrate 时,也要运行rake db:dump:structure。这会将您的架构转储到db/development_structure.sql。当您运行 rake db:test:prepare 时,它现在将使用 development_structure.sql 文件而不是 scheam.rb 文件。

您可以在迁移指南 (http://guides.rubyonrails.org/migrations.html) 的第 6.2 节中阅读更多相关信息。

【讨论】:

这绝对是解决方案

以上是关于Rails + UUID 生成的模式假定 UUID 是整数而不是字符串的主要内容,如果未能解决你的问题,请参考以下文章

在 Rails 项目中同时保存 uuid_ossp 和 pgcrypto

在 Postgresql 中使用 UUID 的 Rails 5.2 活动存储

网卡UUID相同异常处理

多态关联Rails:不同的primary_keys类型(id&uuid)

使用 Rails 5,如何让 FriendlyId 附加 -"count+1" 来复制 slug 而不是 UUID?

lua生成uuid