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 KeytableParent 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