我是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
答案 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_at
和updated_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_at
和updated_at
,类型为datetime,并带有not_null标记。
现在,在第二个迁移文件中,您尝试添加三列:
add_column :articles, :description, :text
add_column :articles, :created_at, :datetime
add_column :articles, :updated_at, :datetime
但正如我们上面所述,它们已经被创建,因此是无法复制的。因此,解决问题的最佳方法是删除第二个迁移文件,使用add_column,一切都应该没问题。