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?

Respuestas a la pregunta(1)

Su respuesta a la pregunta