Ruby on rails Rails:ArgumentError-您可以';无法定义已定义的列
我有一个Rails 6应用程序(6.0.0rc1)。它有很多书籍和作者模型:通过关联。我使用创建了一个联接表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 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
@hashrocketrake db:drop&&rake db:create&&rake db:migrate
@enginersmnky:我已经尝试过了。仍然会出现相同的错误。@hashrocket是否确实删除了错误的迁移文件?如果是这样的话,你能给我们看一下新迁移的内容吗?@hashrocket有没有可能作者:参考书目:参考书目
与创建联接表
是多余的?那应该是rails g迁移CreateJoinTableAuthorsBooks作者书
?