1

我正在开发一个 Rails 应用程序,并添加了Devise gem来验证用户身份。我现在正在进一步开发,我想添加一些 Devise 随附的模块(特别是可确认、可锁定和可验证令牌)。这些模块在原始迁移文件中被注释掉了。我想知道是否可以简单地取消注释这些模块,然后运行“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”添加到这个新的迁移中,就像创建的原始迁移设计一样。我是否将“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”行放在新迁移中的什么位置?
4

1 回答 1

3

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

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

听起来您担心会破坏数据库并丢失大量工作。我建议您在继续之前备份数据库。数据库备份和 git 可以帮助您消除因进行不确定的更改而带来的许多恐惧。

于 2012-08-01T15:41:55.523 回答