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

ただし、Devise が作成した元の移行と同じように、この新しい移行に「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 に答える