Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I create a Rails migration that updates a foreign key with an on-delete cascade constraint?

I’m using Rails 4.2.3 and a PostgreSQL database. I want to write a migration to update one of my foreign keys to have an on-delete cascade constraint, so I created the following:

class UpdateForeignKeyAddOnDeleteConstraint < ActiveRecord::Migration   def change     remove_foreign_key :my_object_times, :my_objects     add_foreign_key :my_object_times, :my_objects, on_delete: cascade   end end 

but when I run the migration I get the error below:

$ rake db:migrate == 20160525203028 UpdateForeignKeyAddOnDeleteConstraint: migrating ============ -- remove_foreign_key(:my_object_times, :my_objects)    -> 0.0454s -- cascade() rake aborted! StandardError: An error has occurred, this and all later migrations canceled:  undefined local variable or method `cascade' for #<UpdateForeignKeyAddOnDeleteConstraint:0x007f82f2c71998> /Users/davea/.rvm/gems/ruby-2.3.0@global/gems/activerecord-4.2.5.1/lib/active_record/migration.rb:664:in `block in method_missing' /Users/davea/.rvm/gems/ruby-2.3.0@global/gems/activerecord-4.2.5.1/lib/active_record/migration.rb:634:in `block in say_with_time' /Users/davea/.rvm/gems/ruby-2.3.0@global/gems/activerecord-4.2.5.1/lib/active_record/migration.rb:634:in `say_with_time' /Users/davea/.rvm/gems/ruby-2.3.0@global/gems/activerecord-4.2.5.1/lib/active_record/migration.rb:654:in `method_missing' 

How am I supposed to write my migration to update the foreign key?

like image 801
Dave Avatar asked May 25 '16 21:05

Dave


People also ask

How rails db Migrate works?

When you run db:migrate, rails will check a special table in the database which contains the timestamp of the last migration applied to the database. It will then apply all of the migrations with timestamps after that date and update the database table with the timestamp of the last migration.

How do I migrate a specific migration in Rails?

To run a specific migration up or down, use db:migrate:up or db:migrate:down . The version number in the above commands is the numeric prefix in the migration's filename. For example, to migrate to the migration 20160515085959_add_name_to_users. rb , you would use 20160515085959 as the version number.


1 Answers

You need to change this line,

add_foreign_key :my_object_times, :my_objects, on_delete: cascade 

With this one:

add_foreign_key :my_object_times, :my_objects, on_delete: :cascade 

The simple difference is that cascade should be a symbol (:cascade) or a string ('cascade').

See the documentation on add_foreign_key for more info.

I hope this helps.

like image 183
ekampp Avatar answered Sep 22 '22 19:09

ekampp