EastsideDev
EastsideDev

Reputation: 6659

Error adding foreign_key

My environemnt:

Ruby 2.2.1
Rails 4.2.4
mysql2 0.3.18 gem

Rails 4.2 introduced add_foreign_key. I am trying to use it so when a search_operation is deleted, the countries that belong to it are deleted from the countries table.

In my models/country.rb, I have:

class Country < ActiveRecord::Base
  belongs_to :search_operation
end

In my models/search_operation.rb, I have:

class SearchOperation < ActiveRecord::Base
  has_many :countries
end

In my create_countries migration, I have:

class CreateCountries < ActiveRecord::Migration
  def change
    create_table :countries do |t|
      t.string :abbreviation
      t.string :status
      t.integer :search_operation_id
      t.timestamps null: false
    end
    add_foreign_key :countries, :search_operations, on_delete: :cascade
  end
end

In my search_operations migration, I have:

class CreateSearchOperations < ActiveRecord::Migration
  def change
    create_table :search_operations do |t|
      t.string :text
      t.string :status
      t.timestamps null: false
    end
  end
end

When I run rake db:migrate, here's what I get:

== 20151010195957 CreateCountries: migrating ==================================
-- create_table(:countries)
   -> 0.0064s
-- add_foreign_key(:countries, :search_operations, {:on_delete=>:cascade})
rake aborted!
StandardError: An error has occurred, all later migrations canceled:

Mysql2::Error: Can't create table 'tracker.#sql-463_8f' (errno: 150): ALTER TABLE `countries` ADD CONSTRAINT `fk_rails_c9a545f88d`
FOREIGN KEY (`search_operation_id`)
  REFERENCES `search_operations` (`id`)
 ON DELETE CASCADE/home/trackur/.rvm/gems/ruby-2.2.1/gems/activerecord-4.2.4/lib/active_record/connection_adapters/abstract_mysql_adapter.rb:305:in `query'

I believe I am using the proper syntax here. Any ideas?

Solution:

Make sure the migration order is: create search_operations table first, followed by other tables that use its id as a foreign key. I guess ActiveRecord is going to follow the chronological order of when the migration files were created.

Upvotes: 2

Views: 1516

Answers (1)

IngoAlbers
IngoAlbers

Reputation: 5812

Make sure you create the search_operations table before the countries table.

If you set a foreign key the referenced table has to exist.

Upvotes: 3

Related Questions