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

时间:2010-03-06 23:29:51

标签: ruby-on-rails

我正在尝试使用UUID作为Rails应用程序的主键,并且在遇到问题后遇到了问题。

我在迁移中指定:     create_table:users,:id => false do | t | 这个:     execute(“ALTER TABLE users ADD PRIMARY KEY(uuid)”)

在我的用户模型中:   set_primary_key“uuid”

使用UUID工具生成UUID。

这一切都很好,我目前遇到的问题是生成的schema.rb如下所示:

create_table“users”,:primary_key => “uuid”,:force =>真的做| t |

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

需要弄清楚如何覆盖schema.rb假定如果主键列是整数的方式....

3 个答案:

答案 0 :(得分: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文件。
  4. 您可以在迁移指南的第6.2节(http://guides.rubyonrails.org/migrations.html)中详细了解这一点。

答案 1 :(得分:1)

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

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

我们只是改变了行

  

create_table“people”,:force =>真的做| t |

  

create_table“people”,:id => false,:force =>真的做| t |

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

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

答案 2 :(得分:0)

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