Ruby on rails rails中的列名重复
我是rails的新手,在一个教程中创建了一些条目。当前,当我运行服务器时,它会告诉我Ruby on rails rails中的列名重复,ruby-on-rails,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: SQ
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
我明白了
在第二次迁移中,去掉行
add\u列:articles,:description,:text
。在第一次迁移中创建articles
表时,您已经创建了description
列,行为t.text:description
:
create_table :articles do |t|
t.string :title
t.text :description
t.timestamps null: false
end
这就是错误中引用的重复列Rails。下次运行迁移之前,您可以检查schema.rb
文件以查看数据库表的外观
第一次忽略了这一点,但您也在复制时间戳列,
在
处创建,在
处更新,因此第二次迁移是不必要的在第二次迁移中,删除行添加列:文章,:description,:text
。在第一次迁移中创建articles
表时,您已经创建了description
列,行为t.text:description
:
create_table :articles do |t|
t.string :title
t.text :description
t.timestamps null: false
end
这就是错误中引用的重复列Rails。下次运行迁移之前,您可以检查schema.rb
文件以查看数据库表的外观
第一次没有注意到这一点,但是您也在复制时间戳列,在
处创建了列,在
处更新了列,因此第二次迁移是不必要的您之所以会收到错误,说您有重复列,是因为您只是试图添加模型中已经存在的列
让我们运行第一个迁移文件:
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 CreateArticles < ActiveRecord::Migration
def change
create_table :articles do |t|
t.string :title
t.text :description
t.timestamps null: false
end
end
end
但正如我们上面所说,它们已经被创建,因此是无法复制的。因此,解决问题的最佳选择是删除第二个迁移文件,其中使用了add_列,一切都应该正常。我在原始帖子中添加了模式。它仍然给我一个错误,当我执行rake db:migrate时,它告诉我在其他地方有一个重复的列。当您的模式已经有时间戳列时,您也在复制时间戳列。那么我是否要删除def change中的所有内容?奇怪的是,老师在上节课上肯定写了这些。他的代码运行良好,我只需删除整个迁移文件AddDescriptionToArticles
。它不起作用,因为您的模式中已经有了这些列,Rails也不允许您运行它。这取决于您是否在团队中工作,是否有Git之类的版本控制,如果您在团队中工作,并且迁移文件已经推送到远程分支,那么是的,始终创建一个新文件,因为它对整个团队来说比较省事,每个人都不需要再次回滚和迁移,而且人们忘记它和浪费时间在不必要的错误上的机会也比较少,简单地创建一个新的迁移意味着每个人需要做的就是运行迁移并继续。我在最初的帖子中添加了这个模式。它仍然给我一个错误,当我执行rake db:migrate时,它告诉我在其他地方有一个重复的列。当您的模式已经有时间戳列时,您也在复制时间戳列。那么我是否要删除def change中的所有内容?奇怪的是,老师在上节课上肯定写了这些。他的代码运行良好,我只需删除整个迁移文件AddDescriptionToArticles
。它不起作用,因为您的模式中已经有了这些列,Rails也不允许您运行它。这取决于您是否在团队中工作,是否有Git之类的版本控制,如果您在团队中工作,并且迁移文件已经推送到远程分支,那么是的,始终创建一个新文件,因为它对整个团队来说比较省事,每个人都不需要再次回滚和迁移,人们忘记它和浪费时间在不必要的错误上的机会也比较少,只需创建一个新的迁移就意味着每个人都需要运行迁移并继续。是的,我记得我的指导老师刚刚教我们,如果我们忘记添加描述之类的内容,如何创建新的迁移文件。我认为我们需要包括这个,但是因为我已经在第一个迁移文件中包含了描述,所以我很好。我只是糊涂了。Rails确实让人困惑,哈哈!谢谢,我明白了。很高兴一切都解决了!享受Ruby on Rails学习的乐趣;)是的,我记得我的指导老师刚刚教我们,如果我们忘记添加描述之类的内容,如何创建新的迁移文件。我认为我们需要包括这个,但是因为我已经在第一个迁移文件中包含了描述,所以我很好。我只是糊涂了。Rails确实让人困惑,哈哈!谢谢,我明白了。很高兴一切都解决了!享受Ruby on Rails学习的乐趣;)
create_table :articles do |t|
t.string :title
t.text :description
t.timestamps null: false
end
class CreateArticles < ActiveRecord::Migration
def change
create_table :articles do |t|
t.string :title
t.text :description
t.timestamps null: false
end
end
end
add_column :articles, :description, :text
add_column :articles, :created_at, :datetime
add_column :articles, :updated_at, :datetime