2012-08-01 110 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