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?
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.
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.
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With