2009-06-30 34 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 
相關問題