2009-06-30 31 views

回答

6

根据Rails的API文档,类型可能的选项是:

:string 
:text 
:integer 
:float 
:decimal 
:datetime 
:timestamp 
:time 
:date 
:binary 
:boolean 

您可以使用:小数,或者如果你需要,你可以直接执行命令:

class MyMigration 
    def self.up 
    execute "ALTER TABLE my_table ADD id LONG" 
    end 
end 

正如wappos指出的那样,您可以使用如下的辅助选项:limit来告诉ActiveRecord您希望列的大小。所以你可以使用带有更大的限制的:int列。

+0

“作为wappos指出的那样,你可以使用辅助选项,如:极限告诉ActiveRecord的,你要多大的列是如此,你会使用:具有较大限制的int列。“ 我不认为这将工作,如果他想要的大于整数将成立。设置较大的限制不会更改最大大小。实际上: – 2009-07-01 06:01:33

+0

:primary_key没有:limit选项,所以这对主键列不起作用。 – 2009-07-01 16:05:57

+2

我只是在Rails文档中查看它,如果使用:limit => 8,则会得到一个bigint。我没有意识到这一点。 – 2009-07-02 07:30:20

7

由于Rails会自动将其设置为主键,因此很难对其进行迁移。

以后,您可以更改任何列是这样的:

change_column :foobars, :something_id, 'bigint'

您可以在初始指定迁移的非主ID作为自定义类型是这样的:

create_table :tweets do |t| 
    t.column :twitter_id, 'bigint' 
    t.column :twitter_in_reply_to_status_id, 'bigint' 
end 

我哪里有“ bigint“,你可以把你的数据库用于你要使用的数据库列类型的任何文本(例如”unsigned long“)。

如果您需要您的id列是bigint,最简单的方法是创建表,然后使用change_column更改同一迁移中的列。

使用PostgreSQL和SQLite,模式更改是原子性的,因此如果迁移失败,这不会使数据库处于奇怪状态。有了MySQL,你需要更加小心。

+0

谢谢 - 它似乎是一个“正常”列使用限制=> 8会做的伎俩,但对于primary_key这不起作用。对于MySQL我现在使用自定义SQL执行。宁愿change_column,但不会有与初始创建相同的问题,即:主键列不支持limit => 8。 – 2009-07-01 16:08:05

+1

不,您可以使用change_column与主键,如下所示:change_column:foobars,:id,“bigint”。所以你要创建表格,然后立即将ID列更改为bigint。我仍然不认为使用:使用int列的限制将会起作用(无论如何使用MySQL),因为无论如何,int的最大大小都是2 ** 31-1。 – 2009-07-01 23:45:44

+1

好吧,我只是在Rails文档中查看它,如果你做t.column:foobar,:int,:limit => 8,你会得到一个bigint。 – 2009-07-02 07:29:14

43

要设置默认主键列类型,迁移文件不是混乱的地方。

相反,只要坚持这种在底部你config/environment.rb

ActiveRecord::ConnectionAdapters::MysqlAdapter::NATIVE_DATABASE_TYPES[:primary_key] = "BIGINT UNSIGNED DEFAULT NULL auto_increment PRIMARY KEY" 

而且所有的表应该与预期的列类型来创建用于id

+--------------+---------------------+------+-----+---------+----------------+ 
| Field  | Type    | Null | Key | Default | Extra   | 
+--------------+---------------------+------+-----+---------+----------------+ 
| id   | bigint(20) unsigned | NO | PRI | NULL | auto_increment | 

你做了以后有什么你已经开始做...下一个问题可能是“我如何使我的外键列是相同的列类型?”因为主键people.idbigint(20) unsignedperson_idint(11)或其他什么是没有意义的?

对于这些列,您可以参考其他建议,例如,

t.column :author_id, 'BIGINT UNSIGNED' 
t.integer :author_id, :limit => 8 

UPDATE:@Notinlist,使用任意列对任意表的主键,你需要做的create_table-change_column舞蹈:

create_table(:users) do |t| 
    # column definitions here.. 
end 
change_column :users, :id, :float # or some other column type 

例如如果我想​​,而不是自动递增的整数,

create_table(:users, :primary_key => 'guid') do |t| 
    # column definitions here.. 
end 
change_column :users, :guid, :string, :limit => 36 
+1

这是一种很有用的方法,但是有什么办法可以使这个数据库无关或者只是为了这个需要而付出的代价? – brokenbeatnik 2011-02-02 01:21:52

2

Rails 3中,MySQL的:

t.column :foobar, :int, :limit => 8 

不给我一个BIGINT,只是一个int。然而,

t.column :twitter_id, 'bigint' 

工作正常。 (虽然它确实把我绑到MySQL。)

2

借用其他解决方案,根据最近为我工作的内容进行调整。

添加到config/initializers的文件中。它声明了一个新的列类型(改编自chookeat的建议)。使用长ID

ActiveRecord::ConnectionAdapters::Mysql2Adapter::NATIVE_DATABASE_TYPES[:long_primary_key] = "BIGINT(20) DEFAULT NULL auto_increment PRIMARY KEY"

迁移是这样:

create_table :notification_logs, :id => false do |t| 

     t.column :id, :long_primary_key 
     # ... 
    end 
5

如果有人需要这个PostgreSQL的工作,创建这样一个初始化:

# config/initializers/bigint_primary_keys.rb 
ActiveRecord::Base.establish_connection 
ActiveRecord::ConnectionAdapters::PostgreSQLAdapter::NATIVE_DATABASE_TYPES[:primary_key] = 'bigserial primary key' 

由于在您建立数据库连接之前,不需要在Rails 3.2(甚至更早的版本)中延迟加载,ActiveRecord::ConnectionAdapters::PostgreSQLAdapter

0

我写了一个名为activerecord-native_db_types_override的gem,它允许您更改将在您的迁移中使用的数据类型。

在你的Gemfile,添加:

gem 'activerecord-native_db_types_override' 

然后到config/environment.rb,使用长IDS Postgres里,添加:

NativeDbTypesOverride.configure({ 
    postgres: { 
    primary_key: { name: "bigserial primary key"} 
    } 
}) 

看到它README长达最新信息。

-1

更正如何更改默认primary key列类型:

相反的:

ActiveRecord::ConnectionAdapters::MysqlAdapter::NATIVE_DATABASE_TYPES[:primary_key] = "BIGINT UNSIGNED DEFAULT NULL auto_increment PRIMARY KEY" 

你应该做的:

ActiveRecord::ConnectionAdapters::MysqlAdapter::NATIVE_DATABASE_TYPES[:primary_key] = "BIGINT(8) UNSIGNED DEFAULT NULL auto_increment PRIMARY KEY" 

,否则你将无法添加foreign key数据库层的限制。

4

rails4,你可以做到这一点。

下面是创建rails4 & postgres一个Dummy模型为例,

xxx_migrate_dummies.rb:

class CreateDummies < ActiveRecord::Migration 
    def change 
    create_table :dummies, :id => false do |t| 
     t.column :id, :serial8, primary_key: true 
     t.string :name, :limit => 50, null: false 
     t.integer :size, null: false 

     t.column :create_date, :timestamptz, null: false 
    end 
    end 
end 

它做什么:

  • 它使用serial8如id类型,它是64位整数,并将其定义为primary key
  • 它使用timestamptz作为日期时间类型,其中包含时区信息,这对跨越多个时区的应用程序很重要。
0

你可以这样说:

class CreateUsers < ActiveRecord::Migration[5.0] 
    def change 
    create_table :users, id: :bigserial do |t| 
     t.string :name 
    end 
    end 
end 
相关问题