иностранец - удалить внешний ключ

Я пытаюсь использовать mailboxer в своем приложении rails 4. Проблема возникает, когда я пытаюсь развернуть файл db. Ошибка возникает при создании таблицы бесед почтового ящика, которая имеет зависимости в таблице уведомлений.

Я пытаюсь удалить внешний ключ для разговоров с уведомлениями.

Я создал миграцию, которая говорит:

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

Однако грабли прерываются и говорят, что внешний ключ не существует.

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

Моя схема включает: add_foreign_key «уведомления», «диалоги», имя: «notifications_on_conversation_id»

Я попытался разгребать db:migrate:down исходную миграцию, создавшую mailboxer, но также получил сообщение об ошибке «команда не найдена».

Кто-нибудь может помочь? Спасибо.


person Mel    schedule 18.05.2014    source источник
comment
Вручную удалите последнюю созданную миграцию, которая показывает ошибку и выступает rn rake db:rollback, чтобы вернуться к предпоследней миграции.   -  person Rajesh Omanakuttan    schedule 18.05.2014
comment
у меня есть много миграций, которые были созданы после этой миграции. я попытался выполнить миграцию: вниз, используя ссылку на метку времени, но команда не удалась.   -  person Mel    schedule 18.05.2014
comment
Ошибка foreign key does not exist может быть связана с тем, что вы не определили модельные отношения внутри моделей.   -  person Rajesh Omanakuttan    schedule 18.05.2014
comment
stackoverflow.com/questions/3380504 /, это также может вам помочь..   -  person Rajesh Omanakuttan    schedule 18.05.2014
comment
Спасибо. Я попытался раскомментировать строки в миграции rails, которые создают внешние ключи почтового ящика, а также ссылку id между этими таблицами, затем я попытался выполнить сброс и миграцию, а затем удалить, создать и перенести базу данных, в которой теперь эти строки внешнего ключа закомментированы. . В каждом случае схема не обновлялась, и ссылка в ней на наличие внешнего ключа остается. Mailboxer не делал моделей для этих объектов — только миграции. Это действительно странно. Но у меня все еще есть эта проблема.   -  person Mel    schedule 18.05.2014


Ответы (3)


Команда add_foreign_key в вашей схеме дала вашему внешнему ключу имя notifications_on_conversation_id. Это имя отличается от имени по умолчанию, которое иностранец обычно присваивает на основе имени столбца, то есть notifications_conversation_id_fk. Таким образом, ваша команда remove_foreign_key должна указывать существующее имя внешнего ключа вместо имени столбца. Пытаться:

remove_foreign_key :notifications, name: "notifications_on_conversation_id"
person cschroed    schedule 18.05.2014
comment
Спасибо большое. В итоге я удалил свою БД и воссоздал ее - после того, как я прокомментировал атрибуты внешнего ключа в миграции почтового ящика. На этот раз я не смогу воспользоваться этим советом, но, похоже, это трюк, если у других возникла такая же проблема. Спасибо. - person Mel; 19.05.2014

# 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

Официальный документ: http://api.rubyonrails.org/v4.2/classes/ActiveRecord/ConnectionAdapters/SchemaStatements.html#method-i-remove_foreign_key

person Dorian    schedule 03.05.2017

Когда я запустил это, я получил:

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

Слова мудрости - никогда не используйте ничего, кроме целого числа id для внешнего ключа. Я использовал параметр title во время практики с поддельным приложением, и это вызывает:

ActiveRecord::AssociationTypeMismatch (Company(#70210936585940) expected, got "Company4" which is an instance of String(#70210933923380))
person CodingBingo    schedule 27.01.2019
comment
это не отвечает на вопрос. Если вы хотите указать на проблему в другом ответе, прокомментируйте ниже, пожалуйста :) - person ARK; 05.12.2019