Процесс, с помощью которого 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
Вы можете просто запустить код прямо из файла 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
, но, похоже, это то, что вам нужно в любом случае.
Предполагая, что Rails достаточно свежая, вы всегда можете запустить:
rake db:migrate:up VERSION=20090408054532
Где версия - это отметка времени в имени файла миграции.
Редактировать: В какой-то момент за последние 8 лет (я не уверен, какая версия) Rails добавлял проверки, предотвращающие запуск, если он уже был запущен. На это указывает запись в таблице schema_migrations
. Чтобы повторно запустить его, просто выполните rake db: migrate: redo VERSION = 20090408054532
.
Если Вы хотите выполнить его от консоли, это - то, что Вы ищете:
$ rails console
irb(main)> require "#{Rails.root.to_s}/db/migrate/XXXXX_my_migration.rb"
irb(main)> AddFoo.migrate(:up)
я попробовал другие ответы, но требующий без Rails.root
не работал на меня.
кроме того, .migrate(:up)
часть вынуждает миграцию повторно выполниться независимо, если она уже работала или нет. Это полезно для того, когда Вы уже выполнили миграцию, отчасти отменили ее путем бездельничания с дб и хотите быстрое решение иметь ее снова.