Rails迁移创建表主键

Rya*_*yan 15 mysql migration optimization ruby-on-rails-3

我正在编写一个迁移脚本来创建一个表,其中包含一个名为的主键列,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
Run Code Online (Sandbox Code Playgroud)

我得到一个表,其中一个名为guidno column 的主键被调用id(这就是我想要的).但是,问题是guid列是INT(11)打开自动增量的.所以我必须运行一个额外的命令:

change_column :global_feeds, :guid, :string, :limit => 25
Run Code Online (Sandbox Code Playgroud)

似乎有点费解,基本上必须运行两个SQL命令才能获得我认为应该可以在一个中执行的操作.

关于如何优化这个的任何建议?

kak*_*oni 25

在Rails 4中你可以做到;

create_table :global_feeds, id: false do |t|
  t.string :guid, primary_key: true
 ...
end
Run Code Online (Sandbox Code Playgroud)

  • 这不应该是字符串,带有uuid的mysql应该是二进制文件(16) (2认同)

Max*_*akh 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);"
Run Code Online (Sandbox Code Playgroud)

如果您不在mySQL上,则应更改execute命令中的查询以使用您的数据库引擎.我不确定你是否可以在SQLite上做到这一点.并且不要忘记将此行放在global_feed.rb模型中的某处:

set_primary_key :guid
Run Code Online (Sandbox Code Playgroud)

无论如何,当你坚持其惯例时,你将充分利用Rails.更改主键名称和类型可能不是一个好主意.