Rails: PG::UndefinedTable: ERROR: relation "..." does not exist

Nick picture Nick · May 17, 2015 · Viewed 19.7k times · Source

On migration I get the following error message:

PG::UndefinedTable: ERROR:  relation "actioncodes" does not exist
: ALTER TABLE "organizations" ADD CONSTRAINT "fk_rails_4ecaa2493e"
FOREIGN KEY ("actioncode_id")
  REFERENCES "actioncodes" ("id")

I have the following migration file for Organizations:

class CreateOrganizations < ActiveRecord::Migration
  def change
    create_table :organizations do |t|
      t.string     :name,         null: false,    limit: 40
      t.references :actioncode,   index: true,    foreign_key: true
      t.boolean    :activated
      t.datetime   :activated_at

      t.timestamps null: false
    end
  end
end

And for Actioncodes I have the migration file:

class CreateActioncodes < ActiveRecord::Migration
  def change
    create_table :actioncodes do |t|
      t.string  :code,          null: false,  limit: 20
      t.string  :description,                 limit: 255

      t.timestamps null: false
    end
  end
end
class AddIndexToActioncodesCode < ActiveRecord::Migration
  def change
    add_index :actioncodes, :code,  unique: true
  end
end

The organization model file includes: belongs_to :actioncode.

While the actioncodes model file includes: has_many :organizations.

Any idea what could be causing the error message?

If I remove index: true, foreign_key: true from the migration file, it migrates without errors. And when I replace that line with the incorrect line t.references :actioncode_id, index: true, foreign_key: true, it gives the error below, where the last line ("ids") suggests Rails somehow seems to have problem with the name of the table?

PG::UndefinedTable: ERROR:  relation "actioncode_ids" does not exist
: ALTER TABLE "organizations" ADD CONSTRAINT "fk_rails_604f95d1a1"
FOREIGN KEY ("actioncode_id_id")
  REFERENCES "actioncode_ids" ("id")

Answer

Prakash Murthy picture Prakash Murthy · May 17, 2015

So the issue is happening because CreateOrganizations migration is being run before CreateActioncodes is executed.

CreateActioncodes is to be run first thereby ensuring that the action codes table exists.

The order in which migrations are run is based on the time stamp of the migration - as indicated in the name of the file. 20141014183645_create_users.rb will run before 20141014205756_add_index_to_users_email.rb as the timestamp of the second one - 20141014205756 is after that of the first one - 20141014183645.

Make sure the time-stamps of the CreateOrganizations migration is after that of CreateActioncodes migration.

Either you could manually change the timestamp in the file names. Or delete these migration files, and create them in the correct order.