Выполните единственный файл миграции

Процесс, с помощью которого scala разрешает супервызов, называется линеаризацией. В вашем примере вы создаете Object как

var d = new A with D with C with B;

Так, как указано в справочных документах scala Здесь вызывается super will разрешается как

l(A) = A >> l(B) >> l(c) >> l(D)

l(A) = A >> B >> l(A) >> l(C) >> l(D)

l(A) = A >> B >> A >> C >> l(B) >> l(D)

l(A) = A >> B >> A >> C >> B >> l(A) >> l(D)

l(A) = A >> B >> A >> C >> B >> A >> l(D)

l(A) = A >> B >> A >> C >> B >> A >> D >> l(A)

l(A) = A >> B >> A >> C >> B >> A >> D >> A

Теперь Начать с левой стороны и удалить дублируемую конструкцию, в которой право будет выигрывать один

, например удалить A, и мы получим

l(A) = B >> C >> B >> D >> A

remove B, и мы получим

l(A) = C >> B >> D >> A

. Здесь у нас нет дубликата. Теперь начинаем звонить с C

CBDA

super.foo в классе C вызовет foo в B и foo в B вызове foo в D и т. Д.

PS здесь l (A) - линеаризация A

253
задан nan 15 April 2009 в 11:03
поделиться

3 ответа

Вы можете просто запустить код прямо из файла ruby:

rails console
>> require "db/migrate/20090408054532_add_foos.rb"
>> AddFoos.up

Примечание: более новые версии rails могут потребовать AddFoos.new.up вместо AddFoos.up .

Альтернативный способ (без IRB), основанный на том факте, что require возвращает массив имен классов:

script/runner 'require("db/migrate/20090408054532_add_foos.rb").first.constantize.up'

Обратите внимание, что если вы сделаете это, он, вероятно, не обновит таблицу schema_migrations , но, похоже, это то, что вам нужно в любом случае.

230
ответ дан agbodike 23 November 2019 в 02:49
поделиться

Предполагая, что Rails достаточно свежая, вы всегда можете запустить:

rake db:migrate:up VERSION=20090408054532

Где версия - это отметка времени в имени файла миграции.

Редактировать: В какой-то момент за последние 8 лет (я не уверен, какая версия) Rails добавлял проверки, предотвращающие запуск, если он уже был запущен. На это указывает запись в таблице schema_migrations . Чтобы повторно запустить его, просто выполните rake db: migrate: redo VERSION = 20090408054532 .

402
ответ дан grepsedawk 23 November 2019 в 02:49
поделиться

Если Вы хотите выполнить его от консоли, это - то, что Вы ищете:

$ rails console
irb(main)> require "#{Rails.root.to_s}/db/migrate/XXXXX_my_migration.rb"
irb(main)> AddFoo.migrate(:up)

я попробовал другие ответы, но требующий без Rails.root не работал на меня.

кроме того, .migrate(:up) часть вынуждает миграцию повторно выполниться независимо, если она уже работала или нет. Это полезно для того, когда Вы уже выполнили миграцию, отчасти отменили ее путем бездельничания с дб и хотите быстрое решение иметь ее снова.

2
ответ дан 23 November 2019 в 02:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: