简体   繁体   中英

rails migration to create a table giving “Table doesn't exist” when referencing a model

I am using rails 5.1.4 with mysql2 adapter.

When I try to create a table having reference to another table in the migration, it gives table doesn't exist. I don't understand why this error pops up. It's meaningless to see an error that can't help with any troubleshooting.

I read another post ( Migration to create table raises Mysql2::Error: Table doesn't exist ) and the solution proposed worked for me. I have a concern though with this solution as it proposes to replace the "references" with "integer" and adding "_id" to the class name being referenced. This makes the DB unaware about the FK constraint (as seen from the mysql executed in the log).

Moreover, this error is happening in few migrations only. Other migrations with references are working fine.

As stated before, the solution that worked doesn't seem right to me.

The migration code that failed is this:

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

Also wanted to add that I've namespaced my models in sub-folders, that's why I've manually named the indexes as they were getting too large to handle by MySQL. Just in case it has to do anything with it.

Below is the screen-shot of my migrations folder having all migrations in order they're run.

Rails应用程序的Migrations文件夹

It is about the order in which you migrate your files are in your `db/migrate' folder.

If the migration-file with table containing Foreign Key is executed before the Parent Table , it throws up the table not found error

In your case, following table's migration should be migrated first
index_places_on_locality , index_places_on_establishment, index_places_on_parking

and then the CreateLocatableEntitiesPlaceEntitiesPlaces table.

Check your order in your `db/migrate'folder

Migration files will be named after the current date and time. So it will execute according that order. Refer Running Migrations

I realized what went wrong with my initial code. Setting foreign_key as true in the migration required the table to be discoverable. As the name of the table wasn't obvious from the name specified in the references, it gave this error.

In rails 5+, you can specify the table name to which the key should refer to. After making this change, I was able to run the migrations without any issues.

Below is the updated code:

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

As mentioned in my question, I name-spaced my models, this was the reason for the lack of obviousness of the table names that rails couldn't find by itself.

This post helped in resolving this issue.: Specifying column name in a "references" migration

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM