2011-11-26 9 views
11

Per esempio ci sono alcuni modelliEsiste un modo per verificare se has_many esiste in 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 

Come posso controllare che il modello ha associazione has_many? Qualcosa di simile

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

E può essere utilizzato in modo

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

Grazie in anticipo

risposta

13

Che dire di 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

Grazie mille! Esattamente quello di cui avevo bisogno) –

0

Si potrebbe semplicemente avere un metodo che tenta di accedere a immagini di oggetti Modello_1 all'interno di un blocco di eccezione come (circa):

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

All'interno del salvataggio, è possibile restituire false se lo si desidera.

+0

Questo potrebbe essere un metodo, o attributo o altro. Non un'associazione. Ma sì, digitando anatra :) –

1

Si potrebbe forse usare respond_to?

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

Probabilmente andrei con la risposta di KARASZI István! – ktec

1

Ho trovato il seguente per essere il modo più semplice per ottenere il risultato desiderato:

ModelName.method_defined?(:method_name) 

Esempio:

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

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