Czy istnieje prosty sposób na podanie nazw klas wszystkich modeli zawierających konkretny problem?Jak wyświetlić listę wszystkich modeli, łącznie z problemem?
Coś jak:
ActiveRecord.models.select{ |m| m.included_modules.include? MyConcernModule }
Czy istnieje prosty sposób na podanie nazw klas wszystkich modeli zawierających konkretny problem?Jak wyświetlić listę wszystkich modeli, łącznie z problemem?
Coś jak:
ActiveRecord.models.select{ |m| m.included_modules.include? MyConcernModule }
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
.
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!
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' :( –
To również nie działa, jeśli modele są leniwie ładowane, co zwykle ma miejsce. Świetny pomysł! – vanboom
Dzięki. Właśnie wyjąłem Concerns :: namespace – rigyt
W Rails 4 (przynajmniej), jest to ** 'include?' **, a nie 'include'. – linkyndy
@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ź. –