remove_references remove_reference rails column ruby-on-rails psql mailboxer foreigner

ruby-on-rails - column - remove_reference rails



extranjero-eliminar clave externa (3)

Cuando corrí que obtuve:

NoMethodError: undefined method `remove_foreign_key'' for #<ActiveRecord::ConnectionAdapters::Table:0x00007faa35e94aa8> Did you mean? remove_index

Palabras de sabiduría: nunca use nada excepto un número entero de identificación para una clave externa. Usé un parámetro de título mientras practicaba en una aplicación falsa y causa:

ActiveRecord::AssociationTypeMismatch (Company(#70210936585940) expected, got "Company4" which is an instance of String(#70210933923380))

Estoy tratando de usar el buzón en mi aplicación Rails 4. Un problema está surgiendo cuando intento desplegar la base de datos. El error se produce al crear la tabla de conversaciones del buzón, que tiene dependencias en la tabla de notificaciones.

Estoy tratando de eliminar la clave externa para las conversaciones de notificaciones.

Creé una migración que dice:

change_table :notifications do |t| t.remove_foreign_key :conversations

Sin embargo, el rastrillo aborta y dice que no existe una clave externa.

rake aborted! An error has occurred, this and all later migrations canceled: PG::UndefinedObject: ERROR: constraint "notifications_conversation_id_fk" of relation "notifications" does not exist

Mi esquema incluye: add_foreign_key "notificaciones", "conversaciones", nombre: "notifications_on_conversation_id"

Intenté rastrear db: migrate: hacia abajo de la migración original que creó el buzón, pero también obtuve un error que decía "comando no encontrado".

¿Alguien puede ayudar? Gracias.


El comando add_foreign_key en su esquema le dio a su clave externa el nombre notifications_on_conversation_id . Este nombre es diferente al nombre predeterminado que el extranjero normalmente asignaría según el nombre de la columna, que es notifications_conversation_id_fk . Por lo tanto, su comando remove_foreign_key debe especificar el nombre de la clave foránea existente en lugar del nombre de la columna. Tratar:

remove_foreign_key :notifications, name: "notifications_on_conversation_id"


# Removes the given foreign key from the table. # Removes the foreign key on +accounts.branch_id+. remove_foreign_key :accounts, :branches # Removes the foreign key on +accounts.owner_id+. remove_foreign_key :accounts, column: :owner_id # Removes the foreign key named +special_fk_name+ on the +accounts+ table. remove_foreign_key :accounts, name: :special_fk_name

Documento oficial: http://api.rubyonrails.org/v4.2/classes/ActiveRecord/ConnectionAdapters/SchemaStatements.html#method-i-remove_foreign_key