如何更改ActiveRecord的ID的(默認)類型? int不夠長,我寧願長。我很驚訝沒有:遷移的時間長了 - 是否只使用一些小數?如何在Rails應用程序中使用long id?
回答
貸http://moeffju.net/blog/using-bigint-columns-in-rails-migrations
class CreateDemo < ActiveRecord::Migration
def self.up
create_table :demo, :id => false do |t|
t.integer :id, :limit => 8
end
end
end
- 查看哪些禁止自動創建id字段
- 的選項
:id => false
的t.integer :id, :limit => 8
線將產生64位整數字段
根據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列。
由於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,你需要更加小心。
謝謝 - 它似乎是一個「正常」列使用限制=> 8會做的伎倆,但對於primary_key這不起作用。對於MySQL我現在使用自定義SQL執行。寧願change_column,但不會有與初始創建相同的問題,即:主鍵列不支持limit => 8。 – 2009-07-01 16:08:05
不,您可以使用change_column與主鍵,如下所示:change_column:foobars,:id,「bigint」。所以你要創建表格,然後立即將ID列更改爲bigint。我仍然不認爲使用:使用int列的限制將會起作用(無論如何使用MySQL),因爲無論如何,int的最大大小都是2 ** 31-1。 – 2009-07-01 23:45:44
好吧,我只是在Rails文檔中查看它,如果你做t.column:foobar,:int,:limit => 8,你會得到一個bigint。 – 2009-07-02 07:29:14
要設置默認主鍵列類型,遷移文件不是混亂的地方。
相反,只要堅持這種在底部你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.id
爲bigint(20) unsigned
和person_id
爲int(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
這是一種很有用的方法,但是有什麼辦法可以使這個數據庫無關或者只是爲了這個需要而付出的代價? – brokenbeatnik 2011-02-02 01:21:52
Rails 3中,MySQL的:
t.column :foobar, :int, :limit => 8
不給我一個BIGINT,只是一個int。然而,
t.column :twitter_id, 'bigint'
工作正常。 (雖然它確實把我綁到MySQL。)
借用其他解決方案,根據最近爲我工作的內容進行調整。
添加到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
如果有人需要這個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
。
我寫了一個名爲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長達最新信息。
更正如何更改默認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
數據庫層的限制。
在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
作爲日期時間類型,其中包含時區信息,這對跨越多個時區的應用程序很重要。
你可以這樣說:
class CreateUsers < ActiveRecord::Migration[5.0]
def change
create_table :users, id: :bigserial do |t|
t.string :name
end
end
end
- 1. Id在rails應用程序中
- 2. 在Rails應用程序中編碼ID
- 3. 如何在Ruby on Rails應用程序中標記id:?
- 4. 在RAILS應用程序中使用JavaScripts
- 5. 在Rails應用程序中使用Nokogiri
- 6. 如何在簡單的Rails應用程序中使用JQuery datepicker?
- 7. 如何在使用JQueryMobile的Rails應用程序中禁用AJAX
- 8. 如何在Rails 3.0應用程序中使用Twitter中的Bootstrap?
- 9. 如何使用angularjs在rails應用程序中初始化kinvey
- 10. 如何在d3.js Rails應用程序中使用json
- 11. 如何在rails應用程序中使用jquery自動完成
- 12. 如何計算在Rails應用程序
- 13. Lat Long在Windows Mobile 6應用程序
- 14. 如何在Rails應用程序
- 15. 如何在Rails 3應用程序中使用Sencha Touch 2?
- 16. 如何在Rails MySQL應用程序中使用json列類型?
- 17. 如何在Rails應用程序中使用SQL_ASCII編碼?
- 18. 如何在rails應用程序中使用ruby的CSS?
- 19. 如何在Rails應用程序中使用ES6(ES2015)?
- 20. 如何在Ruby on Rails應用程序中使用JQuery Mobile
- 21. 如何在rails應用程序中強制使用gem版本?
- 22. 如何在Rails應用程序中使用磁盤配額?
- 23. 如何在rails 3.1應用程序中使用Less?
- 24. 如何在Rails應用程序中使用Google輸入工具?
- 25. 如何在Rails 3.1應用程序中使用REST API?
- 26. 如何在Rails應用程序中使用HTML模板
- 27. 如何在rails應用程序中使用js.erb
- 28. 如何在Rails應用程序中使用喲MYOB
- 29. 如何在我的rails 3.1+應用程序中使用PHP類?
- 30. 如何在現有的Rails應用程序中使用gRPC
「作爲wappos指出的那樣,你可以使用輔助選項,如:極限告訴ActiveRecord的,你要多大的列是如此,你會使用:具有較大限制的int列。「 我不認爲這將工作,如果他想要的大於整數將成立。設置較大的限制不會更改最大大小。實際上: – 2009-07-01 06:01:33
:primary_key沒有:limit選項,所以這對主鍵列不起作用。 – 2009-07-01 16:05:57
我只是在Rails文檔中查看它,如果使用:limit => 8,則會得到一個bigint。我沒有意識到這一點。 – 2009-07-02 07:30:20