В обычном Ruby это работает просто отлично:
class TestSuper
def foo
puts "In TestSuper.foo"
end
end
class TestClass < TestSuper
def foo
super
puts "In TestClass.bar"
end
end
class TestClass
def bar
puts "In TestClass.bar, second definition"
puts "Calling foo:"
foo
end
end
t = TestClass.new
t.foo
t.bar
Я могу вызвать foo () и bar () для экземпляра TestClass и получить именно то, что ожидаю:
In TestSuper.foo
In TestClass.bar
In TestClass.bar, second definition
Calling foo:
In TestSuper.foo
In TestClass.bar
Однако, когда я пытаюсь что-то очень похожее в миграции на Rails, я получаю ошибки:
#### my_model.rb ####
puts "In my_model.rb"
class MyModel
has_many :foo
end
#### my_migration.rb ####
puts "In my_migration.rb"
class MyModel
def bar
foo.each{ |f| f.baz }
end
end
class MyMigration < ActiveRecord::Migration
def self.up
MyModel.find(1).bar
end
def self.down
# Not applicable
end
end
Первая проблема заключается в том, что MyModel.find () исчезает, если у меня нет явного расширения ActiveRecord в my_migration.rb. В противном случае он отбрасывает суперкласс.
Если я это сделаю, я получу ошибку при вызове foo
в MyModel.bar ().
Если я закомментирую определение класса (re) в my_migration.rb, find () и bar () оба будут работать нормально.
Во время отладки я добавил операторы puts
, чтобы увидеть, когда выполняются каждый файл и класс. Похоже, что my_model.rb даже не загружается, если MyModel уже определен (что я делаю в my_migration.rb).
Итак: почему это происходит в Rails, и как я могу обойти это?