Ruby on Rails 5.0与迁移用户表冲突升级

从4.2升级到Rails 5.0后,出现以下错误:

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

PG::DuplicateColumn: ERROR:  column "email" of relation "users" already exists
: ALTER TABLE "users" ADD "email" character varying DEFAULT '' NOT NULL
/Users/my_username/.rvm/gems/ruby-2.3.0/gems/activerecord-5.0.0/lib/active_record/connection_adapters/postgresql/database_statements.rb:98:in `async_exec'
/Users/my_username/.rvm/gems/ruby-2.3.0/gems/activerecord-5.0.0/lib/active_record/connection_adapters/postgresql/database_statements.rb:98:in `block in execute'

阅读以下两个Stack Overflow帖子后:

PGError:错误:关系“用户”的列“email”已经存在

在现有模型上设计迁移

我的问题是哪个是解决与users表发生数据库冲突的最佳方法?

编辑20160703164716 AddDeviseToUsers迁移等现有迁移文件是否最好?还是建议进行新的迁移?

什么是进行新迁移的命令,以及此迁移的最佳名称,以防止在我的开发和基于Heroku的生产环境中发生数据库冲突?

def self.up
  change_table(:users) do |t|
    t.recoverable
    t.trackable
    # rememberable uses remember_token, but this field is different
    t.rename :remember_token_expires_at, :remember_created_at
    # these fields are named differently in devise
    t.rename :crypted_password, :encrypted_password
  end
end

以上是第二篇文章中建议的建议代码。

你将如何使用这些代码并从中进行新的迁移?

在研究迁移之后,我进行了以下迁移:

rails g migration change_data_type_for_users

根据我所了解的上述错误建议修复用户字段,生成我编辑的新迁移。 新的迁移代码:

class ChangeDataTypeForUsers < ActiveRecord::Migration[5.0]
  def change
    change_table(:users) do |t|
      t.string :email,              :null => false, :default => ""
  end
end

运行rails db:migrate后,我收到相同的错误。 我究竟做错了什么? 我现在应该回滚还是编辑新迁移?

我从那以后发现了这个Stack Overflow文章。 (Rails 4 Ruby 2.00在现有的用户模型上设计迁移失败)这是正确的路径吗? 将删除数据库删除所有的数据库数据?

这里的另一个发现导致相信如果执行rake db:reset会破坏我数据库中的数据。 这样做是否重新创建数据库? 目前还不清楚,从后面的文章看来,如果所有的数据都被破坏,将会非常有害。 我们只想修复一个表中的一个字段。

(rake db:migrate db:reset和db:schema:load之间的区别)

我真的想回答我自己的问题,所以这个模型可能会有所不同,除了似乎由ActiveAdmin创建的用户模型之外:

class AdminUser < ApplicationRecord
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable and :omniauthable
  devise :database_authenticatable, 
         :recoverable, :rememberable, :trackable, :validatable
end

在你的情况下,记住你正在试图改变数据库中存在的列,就像你正在创建一个新的那样。

t.string :email, :null => false, :default => ""

您可以将该行更改为

t.change :email, :string, :null => false, :default => ""

在你的块内部,知道“t”是你的用户表

链接地址: http://www.djcxy.com/p/56903.html

上一篇: Ruby on Rails 5.0 upgrade with migrating users table conflicts

下一篇: Ruby rails rake not rolling back far enough