ruby-on-rails - rails : ArgumentError - you can't define an already defined column

标签 ruby-on-rails database-migration has-many-through

我有一个 Rails 6 应用程序 (6.0.0rc1)。它具有具有 has_many :through 关联的书籍和作者模型。我创建了一个连接表

rails g migration CreateJoinTableAuthorsBook author:references books:references

如您所见,我错误地命名了表格并且错误地引用了这本书。我删除了迁移并创建了一个新迁移
rails g migration CreateJoinTableAuthorsBooks author:references book:references

现在,当我运行迁移时,我得到
ArgumentError: you can't define an already defined column 'author_id'.

我搜索了整个 Rails 应用程序,但在任何地方都找不到“author_id”。我运行了之前的迁移(值不正确的迁移)。如何删除以前的“author_id”以便我可以成功运行迁移?

最佳答案

更新 问题可能在于新的迁移。在 Rails 5.2 中(我手边没有 Rails 6)rails g migration CreateJoinTableAuthorsBooks author:references book:references产生这样的迁移:

create_join_table :authors, :books do |t|
  t.references :author, foreign_key: true
  t.references :book, foreign_key: true
end
create_join_table :authors, :books已经创建了一个带有引用的表(尽管它们没有被声明为外键)。 t.references :authort.references :book是多余的。在 Rails 5.2 中,这种冗余被忽略了,但 Rails 6 可能没有。

出于这个原因,我建议调整您的迁移,以便正确声明和索引所有内容。
create_join_table :authors, :books, column_options: { null: false, foreign_key: true } do |t|
  t.index [:author_id, :book_id]
  t.index [:book_id, :author_id]
end

修复错误迁移的正常过程是首先使用 rails db:rollback 回滚迁移。 ,然后删除错误的迁移文件。回滚需要您回滚的迁移仍然存在(并且是可逆的)。

否则,使用 db/schema.rb 中的版本从新的开发数据库开始。与 rails db:reset .请注意,这会破坏您的开发和测试数据库;那应该不是问题。确保您的 db/schema.rb不包含来自错误迁移的更改,通常您可以通过从版本控制中 check out 来确保这一点。

最后,如果一切都真的搞砸了,包括 db/schema.rb , rails db:migrate:reset将重新运行您的所有迁移,重建 db/schema.rb新鲜,并为您提供新鲜的开发和测试数据库。

关于ruby-on-rails - rails : ArgumentError - you can't define an already defined column,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57011310/

相关文章:

ruby-on-rails - Rails form_for with file_field and remote => true and format => :js

jquery - Rails : f. 关联和可点击图像

ruby-on-rails - cucumber 和 rails : testing for the presence of a random record

mysql - 将数据库数据从mssql迁移到mysql

ruby-on-rails - 具有两个多态 has_many 到 : associations for object tagging 的 Rails 模型

ruby-on-rails - rails : HasManyThroughAssociationNotFoundError

ruby-on-rails - LoadError : incompatible library version -/home/ubuntu/. rvm/gems/ruby-2.3.1@lm5/gems/nokogiri-1.8.2/lib/nokogiri/nokogiri.so

ef-code-first - 从迁移中排除 DbContext 以避免上下文参数

python - mysql-connector-python cursor_cent.py 文件上的 Django 迁移错误 'TypeError: sequence item 1: expected a bytes-like object, str found'

ruby-on-rails - 为 has_many :through relationship in Rails 3 创建 Controller 和 View