由于我的用户表中的重复列--Rails 3.1,设计rake db:migrate失败

mar*_*ion 7 ruby-on-rails devise ruby-on-rails-3 ruby-on-rails-3.1

这是我第一次安装Devise并运行时遇到的错误rake db:migrate:

==  AddDeviseToUsers: migrating ===============================================
-- change_table(:users)
rake aborted!
An error has occurred, this and all later migrations canceled:

SQLite3::SQLException: duplicate column name: email: ALTER TABLE "users" ADD "email" varchar(255) DEFAULT '' NOT NULL
Run Code Online (Sandbox Code Playgroud)

鉴于这只是测试数据,我可以删除我的数据库中的那个列并重新运行它,但这似乎不是Railsy - 如果只是因为它将使我的登台服务器(唯一的其他服务器与我的应用程序与我的不同步localhost.

此外,如果与另一列发生冲突,该怎么办?

因此,User在运行迁移之前,这是我的表的模式,我该如何处理?迁移某种重命名的迁移?

# == Schema Information
#
# Table name: users
#
#  id         :integer         not null, primary key
#  email      :string(255)
#  f_name     :string(255)
#  l_name     :string(255)
#  username   :string(255)
#  role_id    :integer
#  picture    :string(255)
#  about_me   :string(255)
#  website    :string(255)
#  created_at :datetime
#  updated_at :datetime
#
Run Code Online (Sandbox Code Playgroud)

Nao*_*den 17

在Devise生成的迁移文件中,更改该行

  t.string :email,              :null => false, :default => ""
Run Code Online (Sandbox Code Playgroud)

对于

  t.change :email, :string,     :null => false, :default => ""
Run Code Online (Sandbox Code Playgroud)

因此,迁移不会尝试创建新的电子邮件列,而是将现有的更改为Devise的规范.


Ben*_*min 4

尝试rake db:rollback然后再试一次。当您第一次执行此操作时,它添加了 id 列。以及为什么你要id :integer not null, primary key在 Rails 中添加它的自动功能。它应该看起来像这样:

class CreateProducts < ActiveRecord::Migration
  def up
    create_table :products do |t|
      t.string :email
      t.text :f_name

      t.timestamps
    end
  end

  def down
    drop_table :products
  end
end
Run Code Online (Sandbox Code Playgroud)

您可以在此处获取更多信息http://guides.rubyonrails.org/migrations.html