2014-04-26 8 views

Odpowiedz

10

mam obawy o nazwie "Obawy :: CoursePhotoable". Oto dwa modele, które go obejmują:

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

W celu wyjaśnienia, moje obawy są naprawdę nazywane "Obawy :: CoursePhotoable". Jeśli twój został nazwany "Fooable", po prostu umieścisz "Fooable", gdzie mam "Concerns :: CoursePhotoable". Rozszyfrowuję swoje obawy, aby uniknąć konfliktów z powiedzeniem "Adresowalny".

EDYCJA: Aktualne wersje Railsów używają include?. Starsze używane include.

+1

Dzięki. Właśnie wyjąłem Concerns :: namespace – rigyt

+0

W Rails 4 (przynajmniej), jest to ** 'include?' **, a nie 'include'. – linkyndy

+0

@AndreiHorak Dzięki. Interesujące, ponieważ powyższe działało z każdą wersją Rails 4, którą miałem 26 kwietnia. Nie jest to już jednak. Zaktualizowano odpowiedź. –

3

Jeśli to twoja własna Troska, można dodać kod śledzenia, gdy jest włączone:

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 

zmiana: chętnych do wcześniejszych modeli obciążenia:

Rails.application.eager_load! 
+0

To staje się niechlujny w trybie programowania szyn, kiedy dokonasz zmiany w 'child_trackable.rb', szyny je przeładowują i tracisz stan zmiennej instancji modułu' included_in' :( –

+0

To również nie działa, jeśli modele są leniwie ładowane, co zwykle ma miejsce. Świetny pomysł! – vanboom

Powiązane problemy