2010-02-23 19 views
8

¿Hay alguna manera de encontrar todos los modelos polimórficos de un tipo polimórfico específico en Rails? Así que si tengo Grupo, Evento, y todo ello con un proyecto de declaración como:¿Encontrar todo por tipo polimórfico en los rieles?

has_many :assignments, :as => :assignable

¿Puedo hacer algo como:

Assignable.all

... o

BuiltInRailsPolymorphicHelper.all("assignable")

Eso estaría bien.

Editar:

... de tal manera que Assignable.all vuelve [Event, Group, Product] (variedad de clases)

+0

He cambiado mi respuesta sobre la base de la información adicional que le diste. Creo que abordará su necesidad. –

Respuesta

12

no hay un método directo para esto. Escribí este parche de mono para ActiveRecord::Base. Esto funcionará para cualquier clase.

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 

Ahora usted puede hacer lo siguiente:

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

Por cierto, esto (sorprendentemente) funciona – Dorian

+0

¿Cómo implemento esto? ¿voy a la clase ActiveRecord :: Base para modificar? No puedo encontrar esta clase en mi proyecto. – james

+1

@james se refieren a esta respuesta: http://stackoverflow.com/questions/2328984/rails-extending-activerecordbase/2329394#2329394 –

-1

Usted debe ser capaz de utilizar sólo la colección asociada:

model.assignments.all 
+0

Esto devolverá todas las 'asignaciones' para una instancia de modelo. Creo que quiere devolver todas las "asignaciones" para un tipo. –

+0

¿Pero no puedes decir Event.assignments.all? –

+0

Rails no agrega ayudantes de asociación estáticos. Entonces 'Event.assignments' lanzará' NoMethodError'. –

0

he creado una clase de modelo polimórfico con un método de 'todos' para probar esto.

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 

Aquí está mi configuración de aplicaciones:

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

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

Para obtener este trabajo en el entorno de desarrollo, debe solicitar los archivos de modelos. – nanda

+0

Esta es una clase especial, no desciende de ActiveRecord. – nanda

Cuestiones relacionadas