Rails 4 Ruby 2.00在现有用户模型上进行设计迁移失败

时间:2014-02-05 16:23:16

标签: devise ruby-on-rails-4 migration

我正在尝试将Devise添加到已经实现的Omniauth和现有用户模型的基于Enki的应用程序中。在github上关注Devise教程并尝试在此处或Devise wiki中发布的几乎所有可能的解决方案之后,我仍然无法让迁移运行。我在运行rake db:migrate时遇到此错误。我知道我需要注释掉电子邮件列(它存在于用户模型中)。我试图评论抛出“已经存在”的错误,但这也不起作用。

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

PG::DuplicateColumn: ERROR:  column "encrypted_password" of relation "users" already exists
: ALTER TABLE "users" ADD COLUMN "encrypted_password" character varying(255) DEFAULT '' NOT NULL/Users/josecfernandezortiz/.rvm/gems/ruby-2.0.0-p353/gems/activerecord-4.0.2/lib/active_record/connection_adapters/postgresql/database_statements.rb:128:in `async_exec'

这是当前架构:

  create_table "users", force: true do |t|
    t.string   "name",           null: false
    t.string   "email",          null: false
    t.datetime "created_at"
    t.datetime "updated_at"
    t.string   "provider"
    t.string   "uid"
    t.string   "role"
    t.datetime "last_logged_in"
  end

这是Devise生成的迁移:

class AddDeviseToUsers < ActiveRecord::Migration
  def self.up
    change_table(:users) do |t|
      ## Database authenticatable
      # t.string :email,              :null => false, :default => ""
      t.string :encrypted_password, :null => false, :default => ""

      ## Recoverable
      t.string   :reset_password_token
      t.datetime :reset_password_sent_at

      ## Rememberable
      t.datetime :remember_created_at

      ## Trackable
      t.integer  :sign_in_count, :default => 0, :null => false
      t.datetime :current_sign_in_at
      t.datetime :last_sign_in_at
      t.string   :current_sign_in_ip
      t.string   :last_sign_in_ip

      ## Confirmable
      # t.string   :confirmation_token
      # t.datetime :confirmed_at
      # t.datetime :confirmation_sent_at
      # t.string   :unconfirmed_email # Only if using reconfirmable

      ## Lockable
      # t.integer  :failed_attempts, :default => 0, :null => false # Only if lock strategy is :failed_attempts
      # t.string   :unlock_token # Only if unlock strategy is :email or :both
      # t.datetime :locked_at


      # Uncomment below if timestamps were not included in your original model.
      # 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
  end

  def self.down
    # By default, we don't want to make any assumption about how to roll back a migration when your
    # model already existed. Please edit below which fields you would like to remove in this migration.
    raise ActiveRecord::IrreversibleMigration
  end
end

我还试图评论t.string :encrypted_password, :null => false, :default => "" ,同样的结果。 谢谢!

1 个答案:

答案 0 :(得分:3)

您的schema.rb文件仅包含与通过迁移特定项目所做的更改相关的架构信息。因此,如果您添加了一个迁移列外,则架构不会反映出这一点。我冒昧地猜测你可能在一个同名的表上添加了Devise或者Devise在之前项目中使用的一些/所有列。

您可以执行以下任何操作:

1)检查用户,并确认是否是这种情况,以及是否是这种情况     a)删除数据库并重新创建(我假设可能存在您不期望的其他问题/表/列)     b)删除列

您可以按如下方式删除并重新创建:

rake db:drop db:create db:schema:load