我正在尝试使用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假定如果主键列是整数的方式....
答案 0 :(得分:3)
我认为最好的方法是从管理Ruby(schema.rb)中的模式切换到在SQL中管理它(development_structure.sql)。
要做到这一点:
config.active_record.schema_format = :sql
rake db:migrate
时,也要运行rake db:dump:structure
。这会将您的架构转储到db/development_structure.sql
。当您运行rake db:test:prepare
时,它现在将使用development_structure.sql
文件而不是scheam.rb
文件。您可以在迁移指南的第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为整数的要求。我绕过这个是在数据库上添加一个唯一的键,然后在每个模型上设置我的默认范围,以通过我的唯一字符串而不是常规整数进行搜索