ruby-on-rails - 运行 rake db :migrate 时,Rails 创建迁移以将列添加到表中会导致错误

标签 ruby-on-rails ruby ruby-on-rails-3 migration

我创建了一个名为“用户”的模型,我创建了一个新的迁移以将一些列添加到用户表中。现在,当我运行 rake db:migrate 时,我得到以下 b/c 错误,它正在尝试再次创建用户表

$ rake db:migrate
==  DeviseCreateUsers: migrating ==============================================
-- create_table(:users)
rake aborted!
An error has occurred, all later migrations canceled:

Mysql::Error: Table 'users' already exists: CREATE TABLE `users`.....

为什么要重新创建表?

这是我用来创建新迁移的命令

$ rails generate migration AddDetailsToUsers home_phone:decimal cell_phone:decimal work_phone:decimal birthday:date home_address:text work_address:text position:string company:string

新的迁移看起来像这样:

class AddDetailsToUsers < ActiveRecord::Migration
  def change
    add_column :users, :home_phone, :decimal
    add_column :users, :cell_phone, :decimal
    add_column :users, :work_phone, :decimal
    add_column :users, :birthday, :date
    add_column :users, :home_address, :text
    add_column :users, :work_address, :text
    add_column :users, :position, :string
    add_column :users, :company, :string
  end
end

编辑

20120511224920_devise_create_users

class DeviseCreateUsers < ActiveRecord::Migration
  def change
    create_table(:users) do |t|
      ## Database authenticatable
      t.string :email,              :null => false, :default => ""
      t.string :username,           :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
      t.datetime :current_sign_in_at
      t.datetime :last_sign_in_at
      t.string   :current_sign_in_ip
      t.string   :last_sign_in_ip

      ## Encryptable
      # t.string :password_salt

      ## 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 # Only if lock strategy is :failed_attempts
      # t.string   :unlock_token # Only if unlock strategy is :email or :both
      # t.datetime :locked_at

      ## Token authenticatable
      # t.string :authentication_token


      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
end

20120619023856_add_name_to_users

class AddNameToUsers < ActiveRecord::Migration
  def change
    add_column :users, :first_name, :string
    add_column :users, :last_name, :string
  end
end

20121031174720_add_details_to_users.rb

class AddDetailsToUsers < ActiveRecord::Migration
  def change
    add_column :users, :home_phone, :decimal
    add_column :users, :cell_phone, :decimal
    add_column :users, :work_phone, :decimal
    add_column :users, :birthday, :date
    add_column :users, :home_address, :text
    add_column :users, :work_address, :text
    add_column :users, :position, :string
    add_column :users, :company, :string
  end
end

最佳答案

Rails 在数据库的“schema_migrations”表中跟踪迁移。除非有“20120511224920”条目,这是 Devise 迁移,它将尝试再次运行它,它似乎已经存在。

如果是这种情况,您可以手动将其添加到表中。

关于ruby-on-rails - 运行 rake db :migrate 时,Rails 创建迁移以将列添加到表中会导致错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13168450/

相关文章:

ruby-on-rails-3 - Rails add_column 具有默认值但默认值不生效

javascript - 输入总和问题

javascript - 使用 Thumbs_up gem 在 Rails 4 中进行 AJAX 化投票

ruby-on-rails - 未初始化的常量 Twilio::Rest Rails

ruby - 使用 octokit ruby​​ 工具包为 github api 获取存储库名称

ruby - float 域错误

ruby-on-rails - Rails/PostgreSQL - 如何验证只能有两个用户 ID 的一种组合?

ruby-on-rails - 将 Ruby on Rails 与 AngularJS 集成的最简洁方法是什么?

ruby-on-rails - 更新 gemspec 文件列表的最佳实践是什么?

ruby-on-rails - 嵌入式 Ruby 中的代码以什么顺序执行?