Ruby on rails Rails:ArgumentError-您可以';无法定义已定义的列

Ruby on rails Rails:ArgumentError-您可以';无法定义已定义的列,ruby-on-rails,database-migration,has-many-through,Ruby On Rails,Database Migration,Has Many Through,我有一个Rails 6应用程序(6.0.0rc1)。它有很多书籍和作者模型:通过关联。我使用创建了一个联接表 rails g migration CreateJoinTableAuthorsBook author:references books:references 正如你所看到的,我对表格的命名不正确,引用的书也不正确。我删除了迁移并创建了一个新迁移 rails g migration CreateJoinTableAuthorsBooks author:references book:r

我有一个Rails 6应用程序(6.0.0rc1)。它有很多书籍和作者模型:通过关联。我使用创建了一个联接表

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\u id”。我运行了上一次迁移(值不正确的迁移)。如何删除以前的“作者id”以便成功运行迁移?

更新问题可能在于新迁移。在Rails 5.2中(我手头没有Rails 6)
Rails g迁移CreateJoinTableAuthorsBooks作者:参考书目:参考书目
生成如下迁移:

create_join_table :authors, :books do |t|
  t.references :author, foreign_key: true
  t.references :book, foreign_key: true
end
create\u join\u table:authors,:books
已经创建了一个包含引用的表(尽管它们不是声明的外键)<代码>t。参考文献:作者和
t。参考文献:书籍
是多余的。在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
railsdb:reset
中的版本开始新的开发数据库。注意,这将吹走您的开发和测试数据库;这不应该是个问题。确保您的
db/schema.rb
不包含来自您的goofed迁移的更改,通常您可以通过从版本控制中检出它来确保这一点

最后,如果一切都乱七八糟,包括
db/schema.rb
rails db:migrate:reset
将重新运行所有迁移,重建
db/schema.rb
fresh,并为您提供新的开发和测试数据库

create_join_table :authors, :books 
将为您修复它,因为Rails6不需要这些声明

我也有同样的问题, 您不再需要参考资料:

# remove these:
t.references :author, foreign_key: true
t.references :book, foreign_key: true
注意:您仍然可以使用
列选项
参数,将
t.references
中使用的选项与
create\u join\u表
一起使用

例如:

create_join_table :authors, :books, column_options: { type: :uuid, null: false, index: true, foreign_key: true } do |t|
    ...
end

我在使用Rails 6应用程序时也遇到了同样的问题

== 20200711132707 CreateProducts: migrating ===================================
-- create_table(:products)
rails aborted!
StandardError: An error has occurred, this and all later migrations canceled:

you can't define an already defined column 'voltage'.
以下是我如何修复它的方法

问题是我定义了两次模型属性,在本例中是
voltage:decimal
。因此,当我运行
railsdb:migrate
时,它会抛出错误

我首先删除了产品的迁移文件

然后为产品重新创建迁移

这次当我运行
railsdb:migrate
时,一切都很好

就这些


我希望这有帮助

您是否已经在上一次迁移中运行了
db:migrate
?是的,我运行了上一次迁移。当我运行
rails db:migrate:reset
时,我得到了相同的错误。如果我运行
railsdb:reset
,我会得到
您有一个待迁移:CreateJoinTableAuthorsBooks
@hashrocket
rake db:drop&&rake db:create&&rake db:migrate
@enginersmnky:我已经尝试过了。仍然会出现相同的错误。@hashrocket是否确实删除了错误的迁移文件?如果是这样的话,你能给我们看一下新迁移的内容吗?@hashrocket有没有可能
作者:参考书目:参考书目
创建联接表
是多余的?那应该是
rails g迁移CreateJoinTableAuthorsBooks作者书