Невозможно запустить сценарии миграции

Я создавал приложение с использованием Ruby on Rails для Windows почти два года, и оно у меня было. В эти выходные я начал переносить свою среду разработки на Ubuntu, потому что она может запускать некоторые инструменты/службы, недоступные в Windows.

Я попытался запустить миграцию и получил сообщение об ошибке:

$ bundle exec rake db:migrate

rake aborted!
StandardError: An error has occurred, this and all later migrations canceled:

Directly inheriting from ActiveRecord::Migration is not supported. Please specify the Rails release the migration was written for:

  class AddAttachmentImportCsvFileToTabClientProjectCommunities < ActiveRecord::Migration[4.2]
/home/joe/.rvm/gems/ruby-2.3.3/gems/activerecord-5.1.6/lib/active_record/migration.rb:525:in `inherited'
/home/joe/workspace/asb_base/db/migrate/20170829235908_add_attachment_import_csv_file_to_tab_client_project_communities.rb:1:in `<top (required)>'

Сначала я попробовал предложение из сообщения об ошибке и явно объявил версию Rails в сценарии миграции. Я использовал ActiveRecord::Migration[4.2], так как это было в сообщении об ошибке, а затем я попробовал ActiveRecord::Migration[5.1], так как это была версия Rails, с которой изначально была написана миграция; ни один не работал в Ubuntu.

Я подумал, может быть, это из-за того, что версия RoR, которая была у меня в Ubuntu (Ruby 2.5.1/Rails 5.2.0), отличалась от версии в Windows (v2.3.3/v5.1.4). Я явно заблокировал свои версии RoR, чтобы использовать то, что у меня было в Windows, а затем запустил миграцию - все та же ошибка msg.

Чего я не понимаю, так это почему rake считает, что рассматриваемый сценарий миграции был написан с использованием Rails v4.x. Даже самый ранний исходный код, который я написал (даже до этого), использовал Rails v5.x. Поиск в Google не дает мне твердых, полезных ответов - кто-нибудь уже решал эту проблему?


person goterpsgo    schedule 08.07.2018    source источник


Ответы (2)


Попробуйте запустить rake db:migrate:reset (делайте это только в процессе разработки!)

«Чего я не понимаю, так это почему rake считает, что рассматриваемый сценарий миграции был написан с использованием Rails v4.x?»

Это не так. Версия (4.2) жестко запрограммирована в качестве примера в сообщении об ошибке.

Из источника ActiveRecord....

def self.inherited(subclass) # :nodoc:
  super
  if subclass.superclass == Migration
    raise StandardError, "Directly inheriting from ActiveRecord::Migration is not supported. " \
      "Please specify the Rails release the migration was written for:\n" \
      "\n" \
      "  class #{subclass} < ActiveRecord::Migration[4.2]"
  end
end
person Mark Merritt    schedule 08.07.2018
comment
Я запустил rails db:migrate:reset и получил Environment data not found in the schema. To resolve this issue, run: bin/rails db:environment:set RAILS_ENV=development. Затем я запустил эту новую команду и получил rails aborted! Don't know how to build task 'db:migrate:set' (see --tasks). - person goterpsgo; 08.07.2018
comment
Просто чтобы уточнить... вы получаете Don't know how to build task 'db:migrate:set' (see --tasks) при запуске bin/rails db:environment:set RAILS_ENV=development? Если нет, и вы используете rails db:migrate:set....it should be rails db:migrate:reset - person Mark Merritt; 08.07.2018

Вы говорите, что «пытались выполнить миграцию», но обратите внимание, что команда, которую вы выполнили:

$ bundle exec rake db:migrate

запустит не одну миграцию, а ВСЕ миграции, которые в настоящее время не работают (то есть еще не запускались для этой среды). Вполне вероятно, что, поскольку вы выполняете миграцию в Ubuntu впервые, эта команда пытается запустить каждую из ваших миграций. Миграции, которые работали в прошлом без наследования от явной версии, не будут работать в этот раз, если вы обновили Rails до 5.1 или более поздней версии с момента их запуска.

Убедитесь, что вы обновляете каждый файл миграции с помощью ActiveRecord::Migration[5.1] (или любой другой правильной версии), если все они нуждаются в повторном запуске. И если вы когда-нибудь захотите перенести только одну миграцию, команда: bundle exec rake db:migrate:up VERSION=XXXXXXXX, где XXXXXXXX — это отметка времени в начале соответствующего файла миграции.

Также обратите внимание, что именно поэтому не рекомендуется перестраивать базы данных из файлов миграции. Вот блог на эту тему.

person Ray    schedule 08.07.2018
comment
Я думал так же, но если миграции работали в версии Rails 5.1.x, разве они не должны работать в Rails 5.2? Я думал, что это была вся цель версии миграции? - person Mark Merritt; 09.07.2018