0

我正在尝试实现 Devise 身份验证库,并添加我可能需要使用的特定于我自己的应用程序的列。

我运行 rake 迁移命令,我得到一个奇怪的错误。这是我的 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

这很奇怪,因为我从未在上面列出的文件中提及这些列中的任何一个。额外的列来自哪里?我的第二个 create_users 文件应该是更新而不是创建吗?

谢谢!

4

2 回答 2

3

您遇到此问题是因为您尝试创建表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)) 以及设计需要操作的所有列。所以你的第二次迁移是没有必要的。它将失败,因为该表已经存在。(时间戳字段也已经存在)如果您想将其他字段添加到用户表中,您可以在初始迁移中添加它们或进行迁移以更新用户表。不要忘记将这些字段添加为用户模型中的可访问属性。

于 2011-05-20T18:09:40.080 回答