ActiveRecord::StatementInvalid: Mysql2::Error: Duplicate column name 'first_name': ALTER TABLE `users` ADD `first_name` varchar(255)
这是我在尝试使用ShipIt部署Rails应用程序时收到的错误。
我的问题是:如何解决此错误?
我使用名为name的属性启动应用程序,然后在下面的迁移中将name分为first\u name和last\u name。当我重置数据库(rails db:reset)时,一切正常。当我删除数据库、创建数据库、迁移更改并手动设置种子时,一切看起来都很好。我的架构似乎只包含我想要的数据。我很困惑。当我使用sql和rails查询表时,列看起来很好。
/app/db/migrate/20180507080705_break_up_fullname_in_users.rb:3:in `up'
这就是造成错误的原因。
这是导致错误的整个迁移过程:
class BreakUpFullnameInUsers < ActiveRecord::Migration[5.2]
def up
add_column :users, :first_name, :string
add_column :users, :last_name, :string
User.all.each do |user|
fn, ln = name.split(' ', 2)
user.update(first_name: fn, last_name: ln)
end
remove_column :users, :name
end
def down
add_column :users, :name, :string
User.all.each do |user|
n = [name.first_name, name.last_name].join(' ')
user.update(name: n)
end
remove_column :users, :first_name
remove_column :users, :last_name
end
end
这是创建表的原始迁移:
class CreateUsers < ActiveRecord::Migration[5.2]
def change
create_table :users do |t|
t.string :email
t.string :name
t.string :username
t.string :password_digest
t.timestamps
end
end
end
这是在“用户”下的“我的架构文件”中的“我的”:
create_table "users", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t|
t.string "email"
t.string "username"
t.string "password_digest"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.string "first_name"
t.string "last_name"
t.boolean "admin", default: false
end