我正在尝试实现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
这很奇怪,因为我从未在上面列出的文件中提及任何这些列。额外的列来自哪里?我的第二个create_users文件应该是更新而不是创建吗?
谢谢!
答案 0 :(得分: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
请查看Migrations了解详情。
答案 1 :(得分:2)
第一次迁移将创建一个表(create_table(:users)),其名称为users,并且所有列都需要运行。因此,您的第二次迁移不是必需的。它将失败,因为该表已存在。 (还有时间戳字段)如果要将其他字段添加到users表,可以在初始迁移中添加它们,或者进行迁移以更新users表。不要忘记将这些字段添加为用户模型中的可访问属性。