rails 迁移以创建 table 在引用模型时给出 "Table doesn't exist"
rails migration to create a table giving "Table doesn't exist" when referencing a model
我正在使用 rails 5.1.4 和 mysql2 适配器。
当我尝试在迁移中创建引用另一个 table 的 table 时,它显示 table 不存在。我不明白为什么会弹出此错误。看到一个不能帮助任何故障排除的错误是没有意义的。
我读了另一个 post (),建议的解决方案对我有用。我对这个解决方案有点担心,因为它建议用 "integer" 替换 "references" 并将“_id”添加到被引用的 class 名称中。这使得数据库不知道 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 处理。以防万一它必须用它做任何事情。
下面是我的迁移文件夹的屏幕截图,其中包含所有迁移的顺序 运行。
这是关于您迁移文件在“db/migrate”文件夹中的顺序。
如果 migration-file
和包含 Foreign Key
的 table
在 Parent Table
之前执行,它会抛出 table not found
错误
在您的情况下,应首先迁移以下 table 的迁移
index_places_on_locality , index_places_on_establishment, index_places_on_parking
然后是
CreateLocatableEntitiesPlaceEntitiesPlaces
table.
在您的“db/migrate”文件夹中检查您的订单
迁移文件将以当前日期和时间命名。所以它会按照那个顺序执行。参考 Running Migrations
我意识到我的初始代码出了什么问题。在迁移中将 foreign_key 设置为 true 需要 table 可被发现。由于 table 的名称与参考文献中指定的名称不明显,因此出现此错误。
在rails 5+中,您可以指定table键应该引用的名称。进行此更改后,我能够 运行 迁移而没有任何问题。
下面是更新后的代码:
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: {to_table: :base_entities_locality_entities_localities}, index: {:name => "index_places_on_locality_id"}
t.references :establishment, foreign_key: {to_table: :locatable_entities_place_entities_establishments}, index: {:name => "index_places_on_establishment_id"}
t.references :parking, foreign_key: {to_table: :locatable_entities_place_entities_parkings}, 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
正如我在问题中提到的,我对我的模型进行了命名空间,这就是 rails 无法自行找到的 table 名称缺乏明显性的原因。
这 post 帮助解决了这个问题。: Specifying column name in a "references" migration
我正在使用 rails 5.1.4 和 mysql2 适配器。
当我尝试在迁移中创建引用另一个 table 的 table 时,它显示 table 不存在。我不明白为什么会弹出此错误。看到一个不能帮助任何故障排除的错误是没有意义的。
我读了另一个 post (
此外,此错误仅在少数迁移中发生。其他带有引用的迁移工作正常。
如前所述,我认为行之有效的解决方案不合适。
失败的迁移代码是这样的:
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 处理。以防万一它必须用它做任何事情。
下面是我的迁移文件夹的屏幕截图,其中包含所有迁移的顺序 运行。
这是关于您迁移文件在“db/migrate”文件夹中的顺序。
如果 migration-file
和包含 Foreign Key
的 table
在 Parent Table
之前执行,它会抛出 table not found
错误
在您的情况下,应首先迁移以下 table 的迁移
index_places_on_locality , index_places_on_establishment, index_places_on_parking
然后是
CreateLocatableEntitiesPlaceEntitiesPlaces
table.
在您的“db/migrate”文件夹中检查您的订单
迁移文件将以当前日期和时间命名。所以它会按照那个顺序执行。参考 Running Migrations
我意识到我的初始代码出了什么问题。在迁移中将 foreign_key 设置为 true 需要 table 可被发现。由于 table 的名称与参考文献中指定的名称不明显,因此出现此错误。
在rails 5+中,您可以指定table键应该引用的名称。进行此更改后,我能够 运行 迁移而没有任何问题。
下面是更新后的代码:
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: {to_table: :base_entities_locality_entities_localities}, index: {:name => "index_places_on_locality_id"}
t.references :establishment, foreign_key: {to_table: :locatable_entities_place_entities_establishments}, index: {:name => "index_places_on_establishment_id"}
t.references :parking, foreign_key: {to_table: :locatable_entities_place_entities_parkings}, 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
正如我在问题中提到的,我对我的模型进行了命名空间,这就是 rails 无法自行找到的 table 名称缺乏明显性的原因。
这 post 帮助解决了这个问题。: Specifying column name in a "references" migration