Переход на Rails5: у таблицы нет внешнего ключа для - PullRequest
0 голосов
/ 12 июня 2018

После переноса моего приложения Rails 4.2 в Rails 5, когда я пытаюсь выполнить миграцию из новой базы данных, я получаю следующую ошибку

Таблица «целях» не имеет внешнего ключа для development_plan

Вот важные миграции:

  1. Создает внешний_ключ с помощью add_reference

    class AddDevelopmentPlanToObjectives < ActiveRecord::Migration
      def change
        add_reference :objectives, :development_plan, index: true, foreign_key: true
      end
    end
    
  2. Удаляет внешний ключ (генерирует ошибку)

    class DropDevelopmentPlans < ActiveRecord::Migration
      def change
        Objective.all.each do |objective|
          company = objective.owner.company
          company.cycles.create name: '4Q 2015', begin_at: Date.today, end_at: 1.year.from_now, current: true unless company.current_cycle
          company.reload
          objective.update cycle: company.current_cycle
        end
        remove_foreign_key :objectives, :development_plan
        remove_reference :objectives, :development_plan, index: true
        drop_table :development_plans
      end
    end
    

Миграция прерывается на remove_foreign_key :objectives, :development_plan

У кого-нибудь была эта проблема?Это также происходит в других аналогичных миграциях ...

Ответы [ 2 ]

0 голосов
/ 23 августа 2018

Я считаю, что to_table следует наклонять во множественном числе:

remove_foreign_key :objectives, to_table: :development_plans

Пожалуйста, обратитесь к rails api docs .

0 голосов
/ 13 июня 2018

Ссылка на эту статью: https://blog.bigbinary.com/2016/03/01/migrations-are-versioned-in-rails-5.html

Rails 5 добавляет версию к классам миграции таким образом:

Миграция, созданная в Rails 5.0:

class CreateTasks < ActiveRecord::Migration[5.0]
 ...
end

Если вы ненет, что он попытается нам слой совместимости.Хотя этот уровень совместимости был нацелен на Rails 4.2, и это то, что он должен использовать по умолчанию в соответствии с этой статьей, я бы попробовал изменить ваши миграции на все:

class AddDevelopmentPlanToObjectives < ActiveRecord::Migration[4.2]
  ....

Посмотрите, поможет ли это.Если нет, я бы изменил ваши миграции, чтобы они соответствовали изменениям, указанным для v5.0

class AddDevelopmentPlanToObjectives < ActiveRecord::Migration[5.0]
  def change
    add_reference :objectives, :development_plan, foreign_key: true
  end
end

class DropDevelopmentPlans < ActiveRecord::Migration[5.0]
  def change
    Objective.all.each do |objective|
      company = objective.owner.company
      company.cycles.create name: '4Q 2015', begin_at: Date.today, end_at: 1.year.from_now, current: true unless company.current_cycle
      company.reload
      objective.update cycle: company.current_cycle
    end
    remove_foreign_key :objectives, :development_plan
    remove_reference :objectives, :development_plan
    drop_table :development_plans
  end
end
...