Anulación de métodos en un módulo ActiveSupport :: Concern que están definidos por un método de clase en el mismo módulo
Tengo un módulo ActiveSupport :: Concern que se parece más o menos a lo siguiente:
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
Esto solo se incluirá en las clases ActiveRecord, de ahí el uso deenum
. Básicamente, estoy anulando eldeclined!
yaccepted!
métodos creados porActiveRecord::Enum.enum
con un poco de lógica adicional propia.
El problema es que esto no funciona, porque cuando llamo@model.declined!
simplemente llama a la implementación original dedeclined!
e ignora mi método personalizado.
Parece que mis métodos personalizados se están incluyendo en la clase de llamadaantes de el bloque incluido se está ejecutando, lo que significa que mis métodos personalizados están siendo anulados por los definidos porenum
, en lugar de al revés.
Hay algunas soluciones fáciles en esta situación particular (por ejemplo, podría mover la llamadaenum
de nuevo en la clase incluida y asegúrese de que esté por encima de la líneainclude MyModel::Acceptance
, pero me pregunto si hay una manera de resolver este problema manteniendo todo en el mismo módulo.
¿Hay alguna manera de llamar a un método de clase dentro deincluded
que define un método de instancia, luego anula ese método de instancia desde dentro del mismoConcern
¿módulo?