22

「users」というモデルを作成し、いくつかの列を users テーブルに追加する新しい移行を作成しました。rake db:migrate を実行すると、b/c 以下のエラーが表示されます。ユーザー テーブルを再度作成しようとしています。

$ rake db:migrate
==  DeviseCreateUsers: migrating ==============================================
-- create_table(:users)
rake aborted!
An error has occurred, all later migrations canceled:

Mysql::Error: Table 'users' already exists: CREATE TABLE `users`.....

テーブルを再度作成しようとしているのはなぜですか?

新しい移行を作成するために使用したコマンドは次のとおりです

$ rails generate migration AddDetailsToUsers home_phone:decimal cell_phone:decimal work_phone:decimal birthday:date home_address:text work_address:text position:string company:string

新しい移行は次のようになります。

class AddDetailsToUsers < ActiveRecord::Migration
  def change
    add_column :users, :home_phone, :decimal
    add_column :users, :cell_phone, :decimal
    add_column :users, :work_phone, :decimal
    add_column :users, :birthday, :date
    add_column :users, :home_address, :text
    add_column :users, :work_address, :text
    add_column :users, :position, :string
    add_column :users, :company, :string
  end
end

編集

20120511224920_devise_create_users

class DeviseCreateUsers < ActiveRecord::Migration
  def change
    create_table(:users) do |t|
      ## Database authenticatable
      t.string :email,              :null => false, :default => ""
      t.string :username,           :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

      ## Encryptable
      # t.string :password_salt

      ## 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

20120619023856_add_name_to_users

class AddNameToUsers < ActiveRecord::Migration
  def change
    add_column :users, :first_name, :string
    add_column :users, :last_name, :string
  end
end

20121031174720_add_details_to_users.rb

class AddDetailsToUsers < ActiveRecord::Migration
  def change
    add_column :users, :home_phone, :decimal
    add_column :users, :cell_phone, :decimal
    add_column :users, :work_phone, :decimal
    add_column :users, :birthday, :date
    add_column :users, :home_address, :text
    add_column :users, :work_address, :text
    add_column :users, :position, :string
    add_column :users, :company, :string
  end
end
4

10 に答える 10

12

Rails は、データベースの「schema_migrations」テーブルで移行を追跡します。Devise の移行である "20120511224920" のエントリがない限り、既に存在しているように見えて再度実行しようとします。

その場合は、テーブルに手動で追加できます。

于 2012-11-05T21:54:01.447 に答える
6

エラーは、元の DeviseCreateUsers 移行を再度実行しようとしているが、users テーブルが既に存在するため実行できないことを示しています。

これを修正するには、ダウン マイグレーションを実行してDeviseCreateUsersから、通常どおりマイグレーションを実行します。あなたはそれを行うことができます:

rake db:migrate:down VERSION=20121031XXXXXXXX
rake db:migrate

20121031XXXXXXXX移行名の日付スタンプはどこにありますか。つまり、名前付きの移行が20120410214815_devise_create_users.rbあり、ファイル名から日付スタンプをコピーして、コマンドに貼り付けます。参照用に移行に関する Rails ガイドを次に示します

編集:これはコメントに記載されていますが、警告の言葉です。テーブルのダウン マイグレーションを実行すると、テーブルに含まれるすべてのエントリが失われます。開発モードで実行していると仮定しているので、これは問題にはなりません。本番環境の場合は、テーブル データをバックアップし、後で再読み込みするために追加の手順を実行する必要があります。

于 2012-10-31T23:07:35.460 に答える
5

新しいデータベースを作成してから、もう一度移行してみてください:

rake db:drop:all
rake db:create:all
rake db:migrate
于 2012-11-05T07:45:05.820 に答える
2

アップとダウンの方法を使用します。ロールバックや特定の移行ファイルの実行に役立ちます。

構文に従ってください。

  class AddDetailsToUsers < ActiveRecord::Migration
    def self.up
      add_column :users, :home_phone, :decimal
      add_column :users, :cell_phone, :decimal
      add_column :users, :work_phone, :decimal
      add_column :users, :birthday, :date
      add_column :users, :home_address, :text
      add_column :users, :work_address, :text
      add_column :users, :position, :string
      add_column :users, :company, :string
   end

   def self.down
      remove_column :users, :home_phone
      remove_column :users, :cell_phone
      remove_column :users, :work_phone
      remove_column :users, :birthday
      remove_column :users, :home_address
      remove_column :users, :work_address
      remove_column :users, :position
      remove_column :users, :company
   end
  end


    In this case please try to migrate using version number.

rake のように db:migrate:down VERSION=version number #version number は移行したいバージョンです。

于 2012-11-07T05:58:57.570 に答える
2

だから私がこれから集めたものから:

  • User モデルはすでにあります
  • これのバージョンが本番環境にあります
  • デフォルトの rails generate devise:install を実行しました
  • 次に rails generate devise User を実行しました

私はそれを望んでいます:

  • ソース管理を使用する
  • コードを何度もチェックする

注: そうでない場合は、そうする必要がある理由を学習しようとしています。

コードを Devise を生成する前に戻します

うまくいけば、Devise を生成する直前に、ポイントの新しいサンドボックスを作成できます。そうでない場合は、プロジェクト ディレクトリをコピーして手動で行います。他の唯一のオプションは、Devise が生成したすべてのファイルを手動で編集することです。

Devise 世代を再実行します

  • Gemfile に gem 'devise' を readd します
  • rails generate device:install
  • Railsはデバイスモデルを生成します

モデルが存在しないことを確認してください! そうしないと、現在抱えている問題に直面します。

現在のユーザーをあるモデルから別のモデルに移行する

認証情報を古いユーザー モデルから新しいユーザー モデルに完全に移動するスクリプトを生成できれば、それで問題ありません。現在の認証に Devise とは異なるハッシュ アルゴリズムを使用している場合は、すべてのパスワードを無効にして、ユーザーにメールの確認コードを使用して新しいパスワードを作成するように要求するか、ユーザーがログインするときに移行することができます。で。最初の方法は、きれいで、完全で、失礼です。2 番目の方法は、醜く、不完全で、静かです。お好きな方法をお選びください。

編集: おそらく、代わりにアルゴリズムを使用するように Devise をカスタマイズする方法を見つけることができます。それはおそらくさらに良いでしょうが、もう少し手間がかかり、かなりもろいです。

もう 1 つのことは、認証モデルがアカウント データで過負荷にならないようにすることです。認証のみを処理するモデルが必要です。このモデルには、アカウントについて追跡したいものをすべて格納するアカウント データ モデルがあります。

于 2012-11-06T03:29:27.520 に答える
1

rails generate devise user生成されたいつか実行したと思いますDeviseCreateUsers。ユーザー モデルとユーザー テーブルを既に作成している場合は、生成された移行ファイルを db/migrate から削除できます。

于 2012-11-01T00:27:34.090 に答える
1

移行のバージョンに予期しない値を提供している可能性があるいくつかの環境変数を確認してください。既存の新しい移行を適用するのではなく、テーブルを破棄する スタック オーバーフローに関する古い質問を見つけました(それが古くなっている場合はご容赦ください) 。db:migrate

彼らは最終的に、環境変数がdb:migrate「0」のバージョンパラメーターで実行されていることを発見しました。これは機能的に同等ですrake db:migrate:down

以前の移行を含むか一致するようにバージョンが予期せず変更されたために、状況が発生する可能性はありますDeviseCreateUsersか?

于 2012-11-08T19:12:54.857 に答える
0

ちょうど試して

最初のファイルで

create_table(:users), :force => true do |t|

これにより、他のテーブルが上書きされます

于 2012-11-06T07:28:34.983 に答える