2008-12-16 21 views

回答

5

在遷移中似乎沒有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 
+0

是啊,這是我的做我的應用程序使用和舊版的rails。 – Vicer 2011-04-05 02:16:28

1

Rails沒有辦法指定列的位置。事實上,我認爲這只是巧合(因此不能被依賴),即按照它們在遷移中命名的順序創建列。

表中的列順序幾乎相關,應該如此:給出的常見「原因」是在執行「SELECT *」時能夠看到特定的子集,但這確實不是一個好的理由。

任何其他原因可能是設計的氣味,但我想知道爲什麼我錯了有效的原因!

在某些平臺上,通過將具有最高可能性的列放到最後(因爲DMBS不會使用任何磁盤空間來「拖尾」NULL)而獲得(小型)空間並節省性能值,但我認爲你必須要在1980年的硬件注意運行。

+0

這不是巧合,它是標準SQL行爲,ALTER TABLE ADD COLUMN將該列添加爲表中最後的序號位置。 MySQL的「AFTER」語法是對標準SQL的擴展。 – 2008-12-17 16:30:54

+0

ANSI標準?或事實上?不要嘀咕,只是好奇。 – 2008-12-18 09:39:38

+0

我正在閱讀「SQL-99 Complete,Really」一書,它將其描述爲ANSI標準行爲,即將附加列作爲表格中最右邊的列添加。 – 2008-12-24 21:16:15

17

當然可以。

  • 簡短的回答:

    add_column :users, :gender, :string, **:after => :column_name** 
    
  • 龍答:

下面是一個例子,假設你想添加一個名爲 「性別」 列後「列用戶名「到」用戶「表。

  1. 類型rails g migration AddGenderToUser gender:string
  2. 添加 「後=>:用戶名」 在遷移時創建,所以它看起來是這樣的:

    class AddSlugToDictionary < ActiveRecord::Migration 
        def change 
        add_column :users, :gender, :string, :after => :username 
        end 
    end 
    
相關問題