我正在编写一个迁移脚本来创建表,该表具有一个名为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命令来获得我认为在一个命令中应该可以实现的东西,这似乎有点复杂。
对如何优化这一点有什么建议吗?
发布于 2011-01-23 02:58:28
我想您正在使用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命令中更改查询,以便在您的DB引擎上工作。不过,我不确定你能否在SQLite上做到这一点。别忘了把这一行放在global_feed.rb模型的某个地方:
set_primary_key :guid无论如何,当您坚持Rails的约定时,您可以最大限度地利用Rails。更改主键名称和类型可能不是一个好主意。
发布于 2015-04-21 15:14:55
在Rails 4中,你可以做到;
create_table :global_feeds, id: false do |t|
t.string :guid, primary_key: true
...
end发布于 2011-01-23 02:59:52
您需要使用#column而不是#string。例如:
create_table(:global_feeds, :primary_key => 'guid') do |t|
t.column :guid, "varchar(25)", :null => false
...
end请注意,除了MySQL之外,varchar类型不能移植到其他数据库。
https://stackoverflow.com/questions/4769725
复制相似问题