2011-11-26 17 views
11

Por ejemplo, hay algunos modelos¿Hay alguna forma de comprobar que existe una asociación has_ ​​many en Rails 3.1?

class Model_1 < ActiveRecord::Base 
    has_many :images, :as => :imageable 
end 

class Model_2 < ActiveRecord::Base 
    # doesn't have has_many association 
end 
... 
class Image < ActiveRecord::Base 
    belongs_to :imageable, :polymorphic => true 
end 

¿Cómo puedo comprobar que el modelo tiene has_many asociación? Algo como esto

class ActiveRecord::Base 
    def self.has_many_association_exists?(:association) 
     ... 
    end 
end 

Y puede ser utilizado de manera

Model_1.has_many_association_exists?(:images) # true 
Model_2.has_many_association_exists?(:images) # false 

Gracias de antemano

Respuesta

13

¿Qué hay de reflect_on_association?

Model_1.reflect_on_association(:images) 

O reflect_on_all_associations:

associations = Model_1.reflect_on_all_associations(:has_many) 
associations.any? { |a| a.name == :images } 
+0

¡Muchas gracias! Exactamente lo que necesitaba) –

0

Se podía tener un método que trata de acceder a imágenes de objetos Modelo_1 dentro de un bloque de excepción como (aproximadamente):

begin 
    model1_obj.images 
rescue 
    puts 'No association between model_1 and images' 
end 

Dentro de rescate, puede simplemente devolver falso si lo desea.

+0

que podría ser un método, o atributo, o cualquier cosa. No es una asociación Pero sí, pato escribiendo :) –

1

Probablemente se podría utilizar respond_to?

class ActiveRecord::Base 
    def self.has_many_association_exists?(related) 
     self.class.associations.respond_to?(related) 
    end 
end 
+0

¡Probablemente vaya con la respuesta de KARASZI István! – ktec

1

I encontraron la siguiente ser la forma sencilla de conseguir el resultado deseado:

ModelName.method_defined?(:method_name) 

Ejemplo:

Model_1.method_defined?(:images) # true 
Model_2.method_defined?(:images) # false 

Referencia: https://stackoverflow.com/a/18066069/936494

Cuestiones relacionadas