【问题标题】:Rails + UUID generated schema assumes UUID is an integer rather than a stringRails + UUID 生成的模式假定 UUID 是整数而不是字符串
【发布时间】: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 假设如果有一个主键列,它将是一个整数....

【问题讨论】:

    标签: ruby-on-rails


    【解决方案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) 中管理架构。

        为此:

        1. 在application.rb中设置config.active_record.schema_format = :sql
        2. 删除您的 schema.rb 文件。
        3. 每次运行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 节中阅读更多相关信息。

        【讨论】:

        • 这绝对是解决方案
        猜你喜欢
        • 2019-11-03
        • 2020-07-30
        • 1970-01-01
        • 2012-01-30
        • 1970-01-01
        • 2021-06-24
        • 1970-01-01
        • 2018-12-04
        • 1970-01-01
        相关资源
        最近更新 更多