2010-02-23 15 views
8

C'è un modo per trovare tutti i modelli polimorfici di uno specifico tipo polimorfico in Rails? Quindi, se ho Group, Evento, e Project tutti con una dichiarazione del tipo:Trova tutti per tipo polimorfico in Rails?

has_many :assignments, :as => :assignable

Posso fare qualcosa di simile:

Assignable.all

... o

BuiltInRailsPolymorphicHelper.all("assignable")

Sarebbe bello.

Edit:

... in modo tale che i rendimenti Assignable.all[Event, Group, Product] (array di classi)

+0

Ho cambiato la mia risposta in base alla informazioni aggiuntive che hai dato. Penso che risponderà alle tue necessità. –

risposta

12

non esiste un metodo diretto per questo. Ho scritto questa patch scimmia per ActiveRecord::Base. Funzionerà per qualsiasi classe.

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 

Ora è possibile effettuare le seguenti operazioni:

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

BTW, questo (sorprendentemente) funziona – Dorian

+0

Come posso implementarlo? vado in classe ActiveRecord :: Base da modificare? non riesco a trovare questa classe nel mio progetto .. – james

+1

@james fare riferimento a questa risposta: http://stackoverflow.com/questions/2328984/rails-extending-activerecordbase/2329394#2329394 –

-1

Dovreste essere in grado di utilizzare solo la raccolta associata:

model.assignments.all 
+0

Ciò restituirà tutti i 'assignments' per un'istanza di modello. Penso che voglia restituire tutti gli "incarichi" per un tipo. –

+0

Ma non puoi semplicemente dire Event.assignments.all? –

+0

Rails non aggiunge helper di associazioni statici. Quindi "Event.assignments" genererà "NoMethodError". –

0

ho creato una classe del modello polimorfica con un metodo di 'tutti' per testare questo.

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 

Qui è la mia messa a punto app:

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

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

Per ottenere questo lavoro nell'ambiente di sviluppo, è necessario richiedere i file dei modelli. – nanda

+0

Questa è una classe speciale, non discende da ActiveRecord. – nanda

Problemi correlati