2012-08-01 71 views
1

我正在開發一款Rails應用程序,並且我添加了Devise gem來驗證用戶身份。我現在正在進一步開發,並且我想添加一些Devise包裝的模塊(特別是Confirmable,Lockable和Token authenticatable)。這些模塊在最初的遷移文件中被註釋掉了。我想知道是否可以簡單地取消註釋這些模塊,然後運行「rake db:migrate」。你可以重新運行這樣的遷移,還是會破壞某些東西?重新運行遷移 - 設計Gem

我會測試一下,但考慮到我已經投入開發的工作,現在我不想破壞任何東西。下面是遷移文件,因爲它主張:

class DeviseCreateUsers < ActiveRecord::Migration 
    def change 
    create_table(:users) do |t| 
     ## Database authenticatable 
     t.string :email,    :null => false, :default => "" 
     t.string :encrypted_password, :null => false, :default => "" 

     ## Recoverable 
     t.string :reset_password_token 
     t.datetime :reset_password_sent_at 

     ## Rememberable 
     t.datetime :remember_created_at 

     ## Trackable 
     t.integer :sign_in_count, :default => 0 
     t.datetime :current_sign_in_at 
     t.datetime :last_sign_in_at 
     t.string :current_sign_in_ip 
     t.string :last_sign_in_ip 

     ## Confirmable 
     # t.string :confirmation_token 
     # t.datetime :confirmed_at 
     # t.datetime :confirmation_sent_at 
     # t.string :unconfirmed_email # Only if using reconfirmable 

     ## Lockable 
     # t.integer :failed_attempts, :default => 0 # Only if lock strategy is :failed_attempts 
     # t.string :unlock_token # Only if unlock strategy is :email or :both 
     # t.datetime :locked_at 

     ## Token authenticatable 
     # t.string :authentication_token 


     t.timestamps 
    end 

    add_index :users, :email,    :unique => true 
    add_index :users, :reset_password_token, :unique => true 
    # add_index :users, :confirmation_token, :unique => true 
    # add_index :users, :unlock_token,   :unique => true 
    # add_index :users, :authentication_token, :unique => true 
    end 
end 

其次,如果我不能重新運行遷移時,我意識到,我必須創建新的遷移和模塊手動添加到「用戶」模式。例如:

rails generate migration AddConfirmationToUsers string:confirmation_token datetime:confirmed_at datetime:confirmation_sent_at string:unconfirmed_email 

不過,我需要「add_index」這個新移民一樣使用創建的原遷移設計。我只是將'add_index'放在遷移的底部(即'add_column'方法之後)?也許這樣的事情:?

class AddConfirmableToUsers < ActiveRecord::Migration 
    def change 
    add_column :users, :price, :decimal 
    add_column :users, :confirmation_token, :string 
    add_column :users, :confirmed_at, :datetime 
    add_column :users, :confirmation_sent_at, :datetime 
    add_column :users, :unconfirmed_email, :string 

    add_index :users, :confirmation_token, :unique => true 
    end 
end 

這樣概括:

  1. 我可以重新運行遷移(編輯之前遷移,然後運行 '耙分貝:遷移')?
  2. 如果我不能重新運行遷移,我會在哪裏將'add_index'行放在新遷移中?

回答

2

您不能只編輯文件並運行db:migrate。 Rails跟蹤哪些遷移已經運行,哪些沒有運行。 Rails認爲它已經運行了這種遷移。

正確的做法是按照上面的建議創建新的遷移。

這聽起來像你擔心你會垃圾你的數據庫,並失去了很多工作。我建議你在繼續之前備份數據庫。數據庫備份和git可以幫助消除您做出不確定的更改帶來的許多恐懼。

+0

這正是我所做的。完全按照我上面所寫的方式撰寫新遷移(只需在遷移底部添加「add_index」)。 – flyingarmadillo 2012-08-06 09:58:39