Rails 迁移创建表主键

Rails Migration Create Table Primary Key(Rails 迁移创建表主键)
本文介绍了Rails 迁移创建表主键的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在编写一个迁移脚本来创建一个具有名为 guid 并且是 VARCHAR(25) 的主键列的表.问题是我觉得我必须加倍努力才能一步到位.

I am writing a migration script to create a table with a primary key column that is named guid and is a VARCHAR(25). The issue is I feel like I am having to double my effort to achieve what should be possible in one step.

如果我跑:

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) 并启用了自动增量.所以我必须运行一个额外的命令:

I get a table with a primary key called guid no column called id (which is what I want). However, the issue is the guid column is an INT(11) with auto increment turned on. So I have to run one additional command:

change_column :global_feeds, :guid, :string, :limit => 25

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

Seems a bit convoluted to have to basically run two SQL commands to get what I believe should be possible in one.

关于如何优化这个有什么建议吗?

Any suggestions on how to optimize this?

推荐答案

我想你使用的是 mySQL,所以这里是你可以尝试的方法

I suppose you're using mySQL, so here is what you can try

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 模型中的某个位置:

If you're not on mySQL you should change the query in the execute command to work on your DB engine. I'm not sure if you can do that on SQLite though. And don't forget to put this line somewhere in global_feed.rb model:

set_primary_key :guid

不管怎样,您在遵守 Rails 惯例的同时,也能充分利用 Rails.更改主键名称和类型可能不是一个好主意.

Anyway you're getting the most out of Rails while you're sticking to its conventions. Changing primary key name and type might not be a very good idea.

这篇关于Rails 迁移创建表主键的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!

相关文档推荐

Hibernate reactive No Vert.x context active in aws rds(AWS RDS中的休眠反应性非Vert.x上下文处于活动状态)
Bulk insert with mysql2 and NodeJs throws 500(使用mysql2和NodeJS的大容量插入抛出500)
Flask + PyMySQL giving error no attribute #39;settimeout#39;(FlASK+PyMySQL给出错误,没有属性#39;setTimeout#39;)
auto_increment column for a group of rows?(一组行的AUTO_INCREMENT列?)
Sort by ID DESC(按ID代码排序)
SQL/MySQL: split a quantity value into multiple rows by date(SQL/MySQL:按日期将数量值拆分为多行)