重新开始迁移 - 设计宝石

时间:2012-08-01 08:16:39

标签: ruby-on-rails ruby-on-rails-3

我正在开发一个rails应用程序,我添加了Devise gem来验证用户身份。我现在进一步开发,我想添加一些Devise随附的模块(特别是Confirmable,Lockable和Token authenticatable)。这些模块在原始的迁移文件中被注释掉了。我想知道是否可以简单地取消注释这些模块,然后运行“rake db:migrate”。你可以重新运行这样的迁移,还是会破坏某些东西?

我会对此进行测试,但鉴于我已经开发的工作,我不想在这一点上破坏任何东西。以下是迁移文件:

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'到这个新的迁移,就像创建的原始迁移Devise一样。我是否只将'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. 我可以重新运行迁移(编辑以前的迁移然后运行 'rake db:migrate')?
  2. 如果我不能重新运行迁移,我会在哪里     将'add_index'行放在新迁移中?

1 个答案:

答案 0 :(得分:2)

您不能只编辑该文件并运行db:migrate。 Rails会跟踪哪些迁移已经运行,哪些迁移没有。 Rails认为它已经进行了迁移。

正确的做法是按照上面的建议创建一个新的迁移。

听起来您担心自己会丢弃数据库并丢失大量工作。我建议你在继续这个之前备份数据库。数据库备份和git可以帮助消除您做出不确定的更改所带来的许多恐惧。