我正在使用rails 5.1.4和mysql2适配器。当我尝试在迁移中创建一个引用另一个表的表时,它会显示“表不存在”。我不明白为什么会出现这个错误。看到不能帮助任何故障排除的错误是没有意义的。
我阅读了另一篇文章(Migration to create table raises Mysql2::Error: Table doesn't exist),所提出的解决方案对我有用。然而,我对这个解决方案有一些担忧,因为它建议用“integer”替换“references”,并在被引用的类名后添加“_id”。这使得数据库不知道FK约束(从日志中执行的mysql可以看出)。
此外,这个错误只发生在少数几个迁移中。其他具有引用的迁移工作正常。
如前所述,解决问题的方法似乎不正确。
失败的迁移代码如下:
我阅读了另一篇文章(Migration to create table raises Mysql2::Error: Table doesn't exist),所提出的解决方案对我有用。然而,我对这个解决方案有一些担忧,因为它建议用“integer”替换“references”,并在被引用的类名后添加“_id”。这使得数据库不知道FK约束(从日志中执行的mysql可以看出)。
此外,这个错误只发生在少数几个迁移中。其他具有引用的迁移工作正常。
如前所述,解决问题的方法似乎不正确。
失败的迁移代码如下:
class CreateLocatableEntitiesPlaceEntitiesPlaces < ActiveRecord::Migration[5.1]
def change
create_table :locatable_entities_place_entities_places do |t|
t.string :name
t.integer :type
t.references :locality, foreign_key: true, index: {:name => "index_places_on_locality_id"}
t.references :establishment, foreign_key: true, index: {:name => "index_places_on_establishment_id"}
t.references :parking, foreign_key: true, index: {:name => "index_places_on_parking_id"}
t.boolean :show_in_map
t.boolean :show_locality_name
t.date :constructed_on
t.integer :total_area
t.float :lat
t.float :long
end
end
end
还想补充一点,我已经将我的模型命名空间化到子文件夹中,这就是为什么我手动命名索引的原因,因为它们对MySQL来说太大了难以处理。以防万一与此有关。
下面是我的迁移文件夹的截图,其中包含按顺序运行的所有迁移。
int
的表时,我遇到了类似的问题。由于Rails 5默认使用bigint
来作为主键和外键类型,而不是int
,所以我不得不在引用中指定type::integer
。我有点惊讶Rails不能自行解决这个问题... - TanguyP