Как Rails узнает, что есть миграции, ожидающие выполнения, если последняя миграция такая же? - PullRequest
0 голосов
/ 07 октября 2018

Учитывая, что у меня есть следующие версии в таблице schema_migrations:

| 20180822231257 |
| 20180822234804 |
| 20180829011800 |
| 20180924212812 |

И учитывая, что я извлекаю конкретную ветку моего проекта со следующими миграциями (ниже я опускаю полное имя файла для db / migrate/*.rb files):

| 20180822231257 |
| 20180822234804 |

20180827225521
20180828172831

| 20180829011800 |

20180911233144
20180913172923

| 20180924212812 |

Как видите, файлы без каналов представляют файлы в моей папке db / migrate, которых нет в файле schema_migrations в базе данных.

Теперь, когда я пытаюсь запустить rails s, я получаю следующую ошибку:

Migrations are pending. To resolve this issue, run:
bin/rake db:migrate RAILS_ENV=development

Когда я посмотрел на schema.rb, я заметил эту строку:

ActiveRecord::Schema.define(version: 20180924212812) do

Так как вывидно, schema.rb указывает на последнюю версию.

Однако в файле schema.rb содержится некоторый код, которого нет в моей базе данных, например оператор create_table для одной из тех миграций, которых нет в базе данных:

  create_table "some_table", force: :cascade do |t|
    t.integer  "some_id",      limit: 4
    t.integer  "default_view", limit: 4
    t.datetime "created_at",             null: false
    t.datetime "updated_at",             null: false
  end

Так что, несмотря начто последняя версия миграции такая же, обнаруживает ли Rails, что некоторые старые миграции не представлены в текущей таблице schema_migrations?

(Как примечание, я думаю, что причина, по которой обе ветви имеют одинаковую последнюю фиксацию, состоит в том, что я думаю, что кто-то выбрал конкретную миграцию на другую ветку, но не другие миграции).

Ответы [ 2 ]

0 голосов
/ 07 октября 2018

здесь

def needs_migration?
  (migrations.collect(&:version) - get_all_versions).size > 0
end

def migrations
  migrations = migration_files.map do |file|
    version, name, scope = parse_migration_filename(file)
    raise IllegalMigrationNameError.new(file) unless version
    version = version.to_i
    name = name.camelize

    MigrationProxy.new(name, version, file, scope)
  end

  migrations.sort_by(&:version)
end
def migration_files
  paths = Array(migrations_paths)
  Dir[*paths.flat_map { |path| "#{path}/**/[0-9]*_*.rb" }]
end

вы можете видеть, что рельсы получили все файлы в db/migrate и вычесть из них все версии из таблицы SchemaMigration.

0 голосов
/ 07 октября 2018

Rails создает таблицу schema_migrations, в которую вставляются все успешно выполненные миграции.Если ваша среда настроена на проверку выполнения всех миграций, она сравнивает все миграции в вашем каталоге db/migrate со всеми version s в таблице schema_migrations.

Содержимое schema.rbгенерируются из вашей базы данных, а не миграций, поэтому, если у вас были некоторые миграции, создайте дополнительные таблицы / столбцы и удалили эти миграции, ваша схема будет содержать таблицы, которых не будет, если вы запустите полный rake db:migrate:reset.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...