У меня есть модуль ActiveSupport:: Concern, который выглядит примерно так:
module MyModel
module Acceptance
extend ActiveSupport::Concern
included do
enum status: [:declined, :accepted]
end
def declined!
self.status = :declined
# some extra logic
self.save!
end
def accepted!
self.status = :accepted
# some extra logic
self.save!
end
end
end
Это только когда-либо будет включено в классы ActiveRecord, следовательно, использование enum. В принципе, я переопределяю методы declined! и accepted!, созданные ActiveRecord::Enum.enum с помощью некоторой дополнительной собственной пользовательской логики.
Проблема в том, что это не работает, потому что когда я вызываю @model.declined!, он просто вызывает исходную реализацию declined! и игнорирует мой пользовательский метод.
Похоже, что мои пользовательские методы включаются в вызывающий класс до, включенный блок выполняется - это означает, что мои пользовательские методы переопределяются теми, которые определены enum, а не другие вокруг.
В этой конкретной ситуации есть несколько простых обходных путей (например, я мог бы переместить вызов enum обратно в класс включения и убедиться, что он выше строки include MyModel::Acceptance, но мне интересно, есть ли способ решить эту проблему проблема, сохраняя все это в одном модуле.
Можно ли каким-либо образом вызвать метод класса в included, который определяет метод экземпляра, а затем переопределить этот метод экземпляра из одного и того же модуля Concern?