2010-02-23 6 views
8

Gibt es eine Möglichkeit, alle polymorphen Modelle eines bestimmten polymorphen Typs in Rails zu finden? Also, wenn ich Gruppe, Ereignis, und Projekt alle mit einer Erklärung wie:Finden Sie alle durch polymorphe Typ in Rails?

has_many :assignments, :as => :assignable

Kann ich so etwas wie:

Assignable.all

... oder

BuiltInRailsPolymorphicHelper.all("assignable")

Das wäre nett.

Edit:

... so dass Assignable.all kehrt [Event, Group, Product] (Array von Klassen)

+0

Ich habe meine Antwort geändert auf der Grundlage der zusätzlichen Informationen, die Sie gab. Ich denke, es wird auf Ihre Bedürfnisse eingehen. –

Antwort

12

Es gibt keine direkte Methode dafür. Ich habe diesen Affenflecken für ActiveRecord::Base geschrieben. Dies funktioniert für jede Klasse.

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 

Jetzt können Sie folgendes tun:

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

BTW, das (überraschend) funktioniert – Dorian

+0

Wie kann ich das umsetzen? gehe ich zur Klasse ActiveRecord :: Base, um zu modifizieren? kann nicht scheinen, diese Klasse in meinem Projekt zu finden .. – james

+1

@james beziehen sich auf diese Antwort: http://stackoverflow.com/questions/2328984/rails-extening-activerecordbase/2329394#2329394 –

-1

Sie sollten die zugehörige Sammlung nur verwenden können:

model.assignments.all 
+0

Dadurch werden alle Zuweisungen für eine Modellinstanz zurückgegeben. Ich denke, er möchte alle Aufgaben für einen Typ zurückgeben. –

+0

Aber können Sie nicht einfach Event.assignments.all sagen? –

+0

Rails fügt keine statischen Assoziationshelfer hinzu. So wird 'Event.assignments'' NoMethodError' werfen. –

0

Ich habe ‚alle‘ eine polymorphe Modell-Klasse mit einer Methode, um dies zu testen.

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 

Hier ist meine App-Setup:

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

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

Um diese Arbeit in der Entwicklungsumgebung zu erhalten, müssen Sie die Modelldateien anfordern. – nanda

+0

Dies ist eine spezielle Klasse, die nicht von ActiveRecord abstammt. – nanda

Verwandte Themen