我正在编写一个迁移脚本来创建一个包含名为guid
且VARCHAR(25)
的主键列的表。问题是我觉得我必须加倍努力才能一步到位。
如果我跑:
create_table(:global_feeds, :primary_key => 'guid') do |t|
t.string :guid, :limit => 25
t.text :title
t.text :subtitle
...
t.timestamps
end
我得到一个名为guid
的主键的表,没有名为id
的列(这就是我想要的)。但是,问题是guid
列是INT(11)
,其中启用了自动增量功能。所以我必须再运行一个命令:
change_column :global_feeds, :guid, :string, :limit => 25
似乎有点费解,基本上必须运行两个SQL命令才能获得我认为应该可以实现的命令。
有关如何优化此项的任何建议吗?
答案 0 :(得分:25)
在Rails 4中,你可以做到;
create_table :global_feeds, id: false do |t|
t.string :guid, primary_key: true
...
end
答案 1 :(得分:20)
我想你正在使用mySQL,所以这是你可以试试的
create_table :global_feeds, {:id => false} do |t|
t.string :guid
t.text :title
t.text :subtitle
t.timestamps
end
execute "ALTER TABLE global_feeds ADD PRIMARY KEY (guid);"
如果您不在mySQL上,则应更改execute
命令中的查询以使用您的数据库引擎。我不确定你是否可以在SQLite上做到这一点。并且不要忘记将此行放在global_feed.rb模型中的某处:
set_primary_key :guid
无论如何,当你坚持其惯例时,你将充分利用Rails。更改主键名称和类型可能不是一个好主意。
答案 2 :(得分:4)
您需要使用#column而不是#string。例如:
create_table(:global_feeds, :primary_key => 'guid') do |t|
t.column :guid, "varchar(25)", :null => false
...
end
请注意,varchar
类型不能移植到MySQL以外的数据库。
答案 3 :(得分:3)
这在Rails 3中是可行的。尝试:
def self.up
create_table(:signups, :id => false) do |t|
t.string :token, :primary => true
查看这个要点,找出将UUID用作主键col的绝佳解决方案:https://gist.github.com/937739
答案 4 :(得分:1)
在Rails 5中,对于从@kakoni迁移ArgumentError: Index name '*' on table '*' already exists
时出现问题rails db:setup
的人,以下内容适用于我
create_table(:global_feeds, primary_key: :guid, id: false) do |t|
t.string :guid
...
end
有关详情,请查看create_table。