2010-05-10 29 views
284

我們有script/generate migration add_fieldname_to_tablename fieldname:datatype用於將新列添加到模型的語法。Rails migration for change列

在同一行上,我們有腳本/生成用於更改列的數據類型嗎?或者我應該直接將SQL寫入我的vanilla遷移中?

我想將列從datetime更改爲date

回答

478

我認爲這應該工作。

change_column :table_name, :column_name, :date 
+0

我希望更多的腳本/生成遷移路線。 change_column在獨立遷移中工作正常 – papdel 2010-05-10 12:10:02

+13

@b_ayan:就我所知,遷移名稱中唯一的神奇單詞是「add」和「remove」。 – 2010-05-10 22:57:35

+0

這裏的排序軌道noob,但是...我明白答案,但不是對這個答案的意見。澄清讚賞:) – 2011-10-12 01:25:20

93

如果您在表格中有多列更改,也可以使用塊。

實施例:

change_table :table_name do |t| 
    t.change :column_name, :column_type, {options} 
end 

更多細節參見API documentation on the Table class

80

我不知道您是否可以從命令行創建遷移來完成所有這些操作,但是您可以創建新遷移,然後編輯遷移以執行此操作。

如果tablename是您的表的名稱,fieldname是您的字段的名稱,並且您想從日期時間更改爲日期,則可以編寫遷移來執行此操作。

您可以創建一個新的遷移:

rails g migration change_data_type_for_fieldname 

然後編輯遷移到使用change_table:

class ChangeDataTypeForFieldname < ActiveRecord::Migration 
    def self.up 
    change_table :tablename do |t| 
     t.change :fieldname, :date 
    end 
    end 
    def self.down 
    change_table :tablename do |t| 
     t.change :fieldname, :datetime 
    end 
    end 
end 

然後運行遷移:

rake db:migrate 
23

當我發現以前的答案,需要三個步驟來改變一列的類型:

第1步:

使用此代碼生成一個新的遷移文件:

rails g migration sample_name_change_column_type 

第2步:

轉到/db/migrate文件夾,並編輯自己遷移文件。有兩種不同的解決方案。

  1. def change 
        change_column(:table_name, :column_name, :new_type) 
    end 
    

2.

def up 
     change_column :table_name, :column_name, :new_type 
    end 

    def down 
     change_column :table_name, :column_name, :old_type 
    end 

第3步:

不要忘記做這個命令:

rake db:migrate 

我已經測試這個解決方案對於Rails 4,它運行良好。

+1

在步驟2中,第一個在運行rake db:rollback後會失敗,我建議您檢查第二個 – Feuda 2016-12-14 09:45:51

+0

是否有一個rails約定,它允許在生成遷移文件時無需執行任何操作即可完成所有操作,然後編輯它? – BKSpurgeon 2017-01-19 23:52:50

+0

@BKSpurgeon是的,請查看文檔:http://edgeguides.rubyonrails.org/active_record_migrations.html – 2017-01-20 09:13:41

0

另一種方法使用遷移更改數據類型

第一步: 您需要使用遷移

前以移除故障數據類型字段名稱:

rails g migration RemoveFieldNameFromTableName field_name:data_type 

這裏不要忘記爲你的字段

指定數據類型

第2步: 現在你可以用正確的數據類型添加字段

例如:

rails g migration AddFieldNameToTableName field_name:data_type 

就是這樣,現在用正確的數據類型字段添加表格就會快樂紅寶石編碼!

1

只是產生遷移:

rails g migration change_column_to_new_from_table_name 

更新遷移這樣的:

class ClassName < ActiveRecord::Migration 
    change_table :table_name do |t| 
     t.change :column_name, :data_type 
    end 
end 

最後

rake db:migrate