rails中的重复列名称

时间:2016-07-21 01:19:28

标签: ruby-on-rails

我是rails的新手,并在我们创建了一些条目的教程之后。目前,当我运行服务器时,它告诉我

Migrations are pending. To resolve this issue, run: bin/rake db:migrate RAILS_ENV=development

然后我注意到看到一些SO帖子后,我应该做像运行

这样的事情
rake db:migrate

然后我意识到,当我这样做时,我得到了一堆线条和一个有这个

的线条
ActiveRecord::StatementInvalid: SQLite3::SQLException: duplicate column name: description: ALTER TABLE "articles" ADD "description" text

我认为问题来自于此。现在我不是rails的专家,但是当我做

时,如何确定这个重复列的位置
rails console- > Article.all 

我得到了

    <ActiveRecord::Relation [#<Article id: 1, title: "This is my first article", 

description: "This is the description", created_at: "2016-07-20 00:03:42", 

updated_at: "2016-07-20 00:03:42">, #<Article id: 2, title: "This is an endited

 title", description: "This is my second description", created_at: "2016-07-20 

00:05:39", updated_at: "2016-07-20 00:40:54">]

我昨天创造的。但这个重复的描述字段在哪里?我应该在哪里看?

我的两个迁移文件就是这样的

class CreateArticles < ActiveRecord::Migration
  def change
    create_table :articles do |t|
      t.string :title
      t.text :description
      t.timestamps null: false
    end
  end
end

另一个

 class AddDescriptionToArticles < ActiveRecord::Migration
      def change
        add_column :articles, :description, :text
        add_column :articles, :created_at, :datetime
        add_column :articles, :updated_at, :datetime
      end
    end

我的架构

ActiveRecord::Schema.define(version: 20160715020218) do

  create_table "articles", force: :cascade do |t|
    t.string   "title"
    t.text     "description"
    t.datetime "created_at",  null: false
    t.datetime "updated_at",  null: false
  end

end

2 个答案:

答案 0 :(得分:1)

第二次迁移中的

取出行add_column :articles, :description, :text。您在第一次迁移中使用行description创建articles表时已经创建了t.text :description列:

create_table :articles do |t|
  t.string :title
  t.text :description
  t.timestamps null: false
end 

这是Rails在错误中引用的重复列。下次运行迁移之前,您可以检查schema.rb文件以查看数据库表的外观

第一次错过了这个,但您也复制了时间戳列created_atupdated_at所以第二次迁移是不必要的

答案 1 :(得分:1)

您收到错误说明您有重复列的原因是因为您只是尝试添加模型中已存在的列。

让我们浏览您的第一个迁移文件:

class CreateArticles < ActiveRecord::Migration
  def change
    create_table :articles do |t|
      t.string :title
      t.text :description
      t.timestamps null: false
    end
  end
end

在create_table块中,您有以下几行: t.string :title&lt; - 这会创建一个string类型的标题列。 t.text :description&lt; - 这会创建一个text类型的描述列。 t.timestamps, null: false&lt; - 这会创建两列:created_atupdated_at,类型为datetime,并带有not_null标记。

现在,在第二个迁移文件中,您尝试添加三列:

add_column :articles, :description, :text
add_column :articles, :created_at, :datetime
add_column :articles, :updated_at, :datetime

但正如我们上面所述,它们已经被创建,因此是无法复制的。因此,解决问题的最佳方法是删除第二个迁移文件,使用add_column,一切都应该没问题。