2010-08-29 223 views
1

嘿,當我第一次開始一個rails項目時,模型用戶就被設計和創建了。在所有的遷移部分之後,它成功地在postgres創建了表格「users」。 那麼,在項目進行一些修改之後,我意識到在表格中缺少一個屬性/新列。Ruby-on-rails中的遷移問題

所以我所做的就是從Postgres的刪除表的用戶,並在我的第一個遷移的Ruby類增加一個新的列:

class CreateUsers < ActiveRecord::Migration 
    def self.up 
    create_table :users do |t| 
     t.string :name 
     t.string :password 
     t.string :email 
     t.string :authorization_token //this is the new attribute that I insert 
     t.datetime :created_at 
     t.datetime :updated_at 

     t.timestamps 
    end 
    end 

    def self.down 
    drop_table :users 
    end 
end 

所以,當我再次運行分貝:遷移跳一個新的用戶表將使用新屬性authorization_token創建,但它不起作用,但沒有錯誤。

(我知道我不應該刪除表,還有另一種聰明的方式做到這一點)

回答

2

遷移正在運行一次&存儲在數據庫中爲已使用(以在schema_migrations表看看) 。您可以嘗試使用rake db:migrate:reset重新運行您的初始遷移,但最好只添加新遷移(您不希望在數據庫中有數據時將其刪除)如下:

authorization_token

腳本/生成遷移add_authorization_token_to_users:字符串

這將產生類似以下的東西:

class AddAuthorizationTokenToUsers < ActiveRecord::Migration 
    def self.up 
    change_table :users do |t| 
     t.string :authorization_token //this is the new attribute that I insert 
    end 
    end 

    def self.down 
    remove_column :users, :authorization_token 
    end 
end 

要了解如何添加/刪除列,change_table等工作,看一看的ActiveRecord :: ConnectionAdapters :: SchemaStatements http://api.rubyonrails.orghttp://guides.rubyonrails.org/migrations.html

3

使用Rails的技巧 - 不要用SQL修改你的表。當你看到這個問題時,你應該寫一個像@nruth所示的新遷移。運行rake:migrate命令對你來說工作得很好。

在這種情況下,由於您已經刪除了'用戶'表,因此您現在的問題是您的數據庫架構與Rails認爲它不同步。要解決這個問題,你可以讓數據庫模式大致匹配Rails認爲是手動創建'用戶'表,運行向下遷移,然後再向上遷移。或者,您可以通過「用戶」表不再存在的事實來加快速度。 Rails將遷移信息存儲在schema_info表(Rails < 2.1)或schema_migrations表(Rails> = 2.1)中。如果刪除該表格,那麼Rails會認爲該模式不存在,並嘗試運行所有向上遷移並再次爲您重新創建「用戶」表。

最後,隨着時間的推移,您可能會累積大量的遷移項目,這些遷移項目會單獨添加一列或兩列,但您忘記了包含該列。如果您尚未發貨或尚未投入生產,那麼您可以編寫一個基準表格類型的遷移。它看起來像這樣:

class CreateBaselineUsers < ActiveRecord::Migration 
    def self.up 
    create_table :users, :force => true do |t| 
     t.string :name 
     ... 

這將強制刪除表並重新創建它與所有你想要的屬性。

+0

謝謝,我做了你說的和工作:) – mateusmaso 2010-08-30 00:53:38