如果我通過MySQL添加一列,我可以指定表中列將使用AFTER修飾符的位置。但是,如果我通過Rails遷移來執行add_column,則該列將在表的末尾創建。在Rails Migration(MySQL)中,你能指定一個新列應該是什麼位置嗎?
是否有鋼軌遷移的任何功能來指定添加列的位置?
如果我通過MySQL添加一列,我可以指定表中列將使用AFTER修飾符的位置。但是,如果我通過Rails遷移來執行add_column,則該列將在表的末尾創建。在Rails Migration(MySQL)中,你能指定一個新列應該是什麼位置嗎?
是否有鋼軌遷移的任何功能來指定添加列的位置?
這是現在在Rails中可能2.3.6+通過傳遞:參數後
給大家,沒有看到有這個功能的好處是:你從來不看你的數據庫ORM之外?如果我在任何類型的UI中查看,我喜歡將外鍵,狀態列,標誌等全部組合在一起。這不會影響應用程序,但肯定會加快我檢查數據的能力。
在遷移中似乎沒有add_column
方法的位置選項。但遷移支持執行文字SQL。我不是Rails的開發者,但像下面這樣:
class AddColumnAfterOtherColumn < ActiveRecord::Migration
def self.up
execute "ALTER TABLE table_name ADD COLUMN column_name INTEGER
AFTER other_column"
end
def self.down
remove_column :table_name, :column_name
end
end
Rails沒有辦法指定列的位置。事實上,我認爲這只是巧合(因此不能被依賴),即按照它們在遷移中命名的順序創建列。
表中的列順序幾乎相關,應該如此:給出的常見「原因」是在執行「SELECT *」時能夠看到特定的子集,但這確實不是一個好的理由。
任何其他原因可能是設計的氣味,但我想知道爲什麼我錯了有效的原因!
在某些平臺上,通過將具有最高可能性的列放到最後(因爲DMBS不會使用任何磁盤空間來「拖尾」NULL)而獲得(小型)空間並節省性能值,但我認爲你必須要在1980年的硬件注意運行。
這不是巧合,它是標準SQL行爲,ALTER TABLE ADD COLUMN將該列添加爲表中最後的序號位置。 MySQL的「AFTER」語法是對標準SQL的擴展。 – 2008-12-17 16:30:54
ANSI標準?或事實上?不要嘀咕,只是好奇。 – 2008-12-18 09:39:38
我正在閱讀「SQL-99 Complete,Really」一書,它將其描述爲ANSI標準行爲,即將附加列作爲表格中最右邊的列添加。 – 2008-12-24 21:16:15
我創建了一個補丁,增加了這一附加功能的ActiveRecord從MySQL適配器。它適用於主機和2-3穩定。
它可能是特定於mysql的,但它不會使你的migrat離子便攜性差(其他適配器會忽略額外的定位選項)。
當然可以。
簡短的回答:
add_column :users, :gender, :string, **:after => :column_name**
龍答:
下面是一個例子,假設你想添加一個名爲 「性別」 列後「列用戶名「到」用戶「表。
rails g migration AddGenderToUser gender:string
添加 「後=>:用戶名」 在遷移時創建,所以它看起來是這樣的:
class AddSlugToDictionary < ActiveRecord::Migration
def change
add_column :users, :gender, :string, :after => :username
end
end
是啊,這是我的做我的應用程序使用和舊版的rails。 – Vicer 2011-04-05 02:16:28