2014-04-26 10 views

risposta

10

ho una preoccupazione denominata "Le preoccupazioni :: CoursePhotoable". Ecco i due modelli che lo includono:

> ActiveRecord::Base.descendants.select{|c| \ 
    c.included_modules.include?(Concerns::CoursePhotoable)}.map(&:name) 
=> ["Course", "ProviderCourse"] 

Per chiarire, la mia preoccupazione è in realtà il nome di "Le preoccupazioni :: CoursePhotoable". Se il tuo nome è "Fooable" devi semplicemente mettere "Fooable" dove ho "Concerns :: CoursePhotoable". Io spiego i miei interessi per evitare conflitti con dire "Indirizzabile".

MODIFICA: le versioni correnti di Rails utilizzano include?. Precedentemente utilizzato include.

+1

Grazie. Ho appena estratto lo spazio dei nomi di Concerns :: – rigyt

+0

In Rails 4 (almeno), è ** 'include?' **, non 'include'. – linkyndy

+0

@AndreiHorak Grazie. Interessante dato che quanto sopra funzionava con qualsiasi versione di Rails 4 che stavo eseguendo il 26 aprile. Non lo è più. Aggiornata la risposta. –

3

Se è vostra preoccupazione, è possibile aggiungere il codice per tenere traccia quando è incluso:

require 'active_support/concern' 

module ChildTrackable 
    extend ActiveSupport::Concern 

    # keep track of what classes have included this concern: 
    module Children 
    extend self 
    @included_in ||= [] 

    def add(klass) 
     @included_in << klass 
    end 

    def included_in 
     @included_in 
    end 
    end 

    included do 

    # track which classes have included this model concern 
    Children.add self 

    end 

end 

# access at: 
ChildTrackable::Children.included_in 

aggiornamento: per modelli di carico desiderosi precedenti:

Rails.application.eager_load! 
+0

Questo diventa complicato nella modalità di sviluppo delle rotaie, quando apporti una modifica a "child_trackable.rb', le rotaie lo ricaricano e perdi lo stato della variabile di istanza del modulo' included_in' :( –

+0

Anche questo non funziona se i modelli sono pigri carichi, che è in genere il caso. Ottima idea però! – vanboom

Problemi correlati