私は 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
要約として:
- 移行を再実行できますか (以前の移行を編集してから「rake db:migrate」を実行します)?
- 移行を再実行できない場合、新しい移行のどこに「add_index」行を配置しますか?