0

Devise認証ライブラリを実装し、自分のアプリケーションに固有の使用する必要のある列を追加しようとしています。

rake Migrationコマンドを実行すると、奇妙なエラーが発生します。これが私のdevise_create_usersファイルです:

class DeviseCreateUsers < ActiveRecord::Migration
  def self.up
    create_table(:users) do |t|
      t.database_authenticatable :null => false
      t.recoverable
      t.rememberable
      t.trackable

      # t.encryptable
      # t.confirmable
      # t.lockable :lock_strategy => :failed_attempts, :unlock_strategy => :both
      # t.token_authenticatable


      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

  def self.down
    drop_table :users
  end
end

そして最小限のcreate_usersファイル

class CreateUsers < ActiveRecord::Migration
  def self.up
    create_table :users do |t|

      t.timestamps
    end
  end

  def self.down
    drop_table :users
  end
end

しかし、奇妙なことに、移行を実行すると、次のエラーが発生します。

Mysql2::Error: Table 'users' already exists: CREATE TABLE `users` (`id` int(11) DEFAULT NULL auto_increment PRIMARY KEY, `email` varchar(255) DEFAULT '' NOT NULL, `encrypted_password` varchar(128) DEFAULT '' NOT NULL, `reset_password_token` varchar(255), `reset_password_sent_at` datetime, `remember_created_at` datetime, `sign_in_count` int(11) DEFAULT 0, `current_sign_in_at` datetime, `last_sign_in_at` datetime, `current_sign_in_ip` varchar(255), `last_sign_in_ip` varchar(255), `created_at` datetime, `updated_at` datetime) ENGINE=InnoDB

上記のファイルでこれらの列のいずれにも言及していないため、これは非常に奇妙です。余分な列はどこから来ていますか?そして、2番目のcreate_usersファイルはcreateではなくupdateにする必要がありますか?

ありがとう!

4

2 に答える 2

3

テーブルを2回作成しようとしているため、この問題が発生していますusers

最初の移行ではテーブルusersが作成され、表示される奇妙な列は工夫によって作成されます。

列を更新する必要がある場合は、次を使用します。

class CreateUsers < ActiveRecord::Migration
  def self.up
    add_column :table_name, :new_column_name, :data_type  #add new column
    remove_column :table_name, :column_to_remove          #remove an existing column
  end

  ...
end

詳細については、移行をご覧ください。

于 2011-05-20T18:14:03.413 に答える
2

最初の移行では、users という名前のテーブル (create_table(:users)) が作成され、操作に必要なすべての列が作成されます。したがって、2 回目の移行は必要ありません。テーブルが既に存在するため、失敗します。(タイムスタンプ フィールドも既に配置されています) ユーザー テーブルに他のフィールドを追加する場合は、最初の移行でそれらを追加するか、ユーザー テーブルを更新するために移行を行うことができます。これらのフィールドをアクセス可能な属性としてユーザー モデルに追加することを忘れないでください。

于 2011-05-20T18:09:40.080 に答える