Я создаю библиотеку, чтобы добавить функциональность к ActiveRecord::Migration
, но я изо всех сил пытаюсь понять поведение.
Когда библиотека загружена, я выполняю следующий код
ActiveSupport.on_load(:active_record) do
ActiveRecord::Migration.prepend MyLibrary::Mutators
end
Затем в my_library/mutators.rb
module MyLibrary
module Mutators
def do_something
# do stuff here and use `self`
end
end
end
Цель здесь очень проста, мне нужно иметь возможность вызывать этот метод в моих классах миграции
class Test < ActiveRecord::Migration[5.2]
do_something
def change
create_table 'async_test' do |t|
t.string :test
end
end
end
Когда я запустите эту миграцию, она будет эффективно вызывать do_something
Проблема в том, что когда я пытаюсь получить некоторый контекст о том, что запускается, что необходимо для моей библиотеки для выполнения других вещей, self
является экземпляром ActiveRecord::Migration
, а не Test
, но классом, использующим этот метод Test
.
#<ActiveRecord::Migration:0x00007fac5b83df38
@connection=nil,
@name="ActiveRecord::Migration",
@version=nil>
Если я что-то поменяю и позвоню do_something
в #change
, он будет считать self
экземпляром Test
, что мне бы хотелось на уровне класса.
Как я могу получить do_something
, чтобы вернуть self
как Test
на уровне класса, увеличив ActiveRecord::Migration
?