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 活动存储
多态关联Rails:不同的primary_keys类型(id&uuid)