10

Ho un modulo ActiveSupport :: La preoccupazione che si presenta più o meno simile al seguente:Sostituzione di metodi in un modulo ActiveSupport :: La preoccupazione che sono definite da un metodo di classe nello stesso modulo

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 

Questo è sempre e solo andando da includere nelle classi ActiveRecord, da qui l'uso di enum. Fondamentalmente, sto sovrascrivendo i metodi declined! e accepted! creati da ActiveRecord::Enum.enum con qualche logica personale aggiuntiva.

Il problema è che questo non funziona, perché quando chiamo @model.declined! giustifica l'implementazione originale di declined! e ignora il mio metodo personalizzato.

Sembra che i miei metodi personalizzati vengono inclusi nella classe chiamata prima il blocco incluso è in esecuzione - che significa i miei metodi personalizzati vengono sostituite da quelle definite dal enum, anziché il contrario.

Ci

alcune soluzioni semplici in questa particolare situazione (ad esempio, ho potuto spostare la chiamata enum di nuovo nella classe compresa e assicurarsi che sia al di sopra della linea di include MyModel::Acceptance, ma mi chiedo se c'è un modo per risolvere questo problema, mantenendo tutto nello stesso modulo.

c'è un modo posso chiamare un metodo di classe all'interno di included che definisce un metodo di istanza, quindi ignorare che metodo di istanza all'interno dello stesso modulo Concern?

risposta

8

Penso che tu sia cercando define_method.

+0

Potresti approfondire il motivo per cui funziona? In Rails 3.2 @ GeorgeMillo funziona bene. In Rails 4.2 non lo fa. Hanno cambiato qualcosa internamente su come vengono aggiunti i metodi? –

+0

Ho appena riletto la domanda e c'è una specie di spiegazione lì. Ma qualsiasi informazione aggiuntiva sarebbe accettata con gratitudine :) –