2010-02-23 8 views
8

Czy istnieje sposób na znalezienie wszystkich polimorficznych modeli określonego typu polimorficznego w Railsach? Więc jeśli mam Group, zdarzenia oraz projektu Wszystkie z oświadczeniem, takich jak:Znaleźć wszystko przez Polymorphic Wpisz w Rails?

has_many :assignments, :as => :assignable

Czy mogę zrobić coś takiego:

Assignable.all

... lub

BuiltInRailsPolymorphicHelper.all("assignable")

To byłoby miłe.

Edit:

... taki, że Assignable.all powraca [Event, Group, Product] (array klas)

+0

zmieniłem moją odpowiedź na podstawie dodatkowych informacji dałeś. Myślę, że to zaspokoi twoją potrzebę. –

Odpowiedz

12

Nie ma bezpośredniego metoda dla tego. Napisałem tę łatkę małpy dla ActiveRecord::Base. To zadziała dla każdej klasy.

class ActiveRecord::Base 

    def self.all_polymorphic_types(name) 
    @poly_hash ||= {}.tap do |hash| 
     Dir.glob(File.join(Rails.root, "app", "models", "**", "*.rb")).each do |file| 
     klass = (File.basename(file, ".rb").camelize.constantize rescue nil) 
     next if klass.nil? or !klass.ancestors.include?(ActiveRecord::Base) 
     klass.reflect_on_all_associations(:has_many).select{|r| r.options[:as] }.each do |reflection| 
      (hash[reflection.options[:as]] ||= []) << klass 
     end 
     end 
    end 
    @poly_hash[name.to_sym] 
    end 

end 

Teraz można wykonać następujące czynności:

Assignable.all_polymorphic_types(:assignable).map(&:to_s) 
# returns ['Project', 'Event', 'Group'] 
+1

BTW, to (zaskakująco) działa – Dorian

+0

Jak mogę to zaimplementować? przejść do klasy ActiveRecord :: Base do modyfikacji? Nie mogę znaleźć tej klasy w moim Projekcie. – james

+1

@james odnoszą się do tej odpowiedzi: http://stackoverflow.com/questions/2328984/rails-extending-activerecordbase/2329394#2329394 –

-1

Powinieneś być w stanie po prostu użyć powiązanych kolekcję:

model.assignments.all 
+0

Spowoduje to zwrócenie wszystkich "przydziałów" dla instancji modelu. Myślę, że chce zwrócić wszystkie "zadania" dla danego typu. –

+0

Ale czy nie możesz po prostu powiedzieć Event.assignments.all? –

+0

Railsy nie dodają pomocników asocjacyjnych statycznych. Więc 'Event.assignments' rzuci' NoMethodError'. –

0

stworzyłem polimorficzny klasę modelu z metodą „wszystko”, aby to sprawdzić.

class Profile 
    # Return all profile instances 
    # For class return use 'ret << i' instead of 'ret << i.all' 
    def self.all 
    ret = [] 
    subclasses_of(ActiveRecord::Base).each do |i| 
     unless i.reflect_on_all_associations.select{|j| j.options[:as] == :profile}.empty? 
     ret << i 
     end 
    end 
    ret.flatten 
    end 

    def self.all_associated 
    User.all.map{|u| u.profile }.flatten 
    end 
end 

Oto moja aplikacja setup:

User < ActiveRecord::Base 
    belongs_to :profile, :polymorphic => true 
end 

Student < ActiveRecord::Base 
    has_one :user, :as => :profile 
end 
+0

Aby uzyskać tę pracę w środowisku programistycznym, musisz wymagać plików modeli. – nanda

+0

To jest specjalna klasa, nie pochodzi z ActiveRecord. – nanda