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.
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
?
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? –
Ho appena riletto la domanda e c'è una specie di spiegazione lì. Ma qualsiasi informazione aggiuntiva sarebbe accettata con gratitudine :) –