2011-11-26 16 views
11

Na przykład istnieją pewne modeleCzy istnieje sposób sprawdzenia, czy istnieje wiele powiązań istnieje w 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 

Jak mogę sprawdzić, czy model ma stowarzyszenie has_many? Coś takiego

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

i może być stosowany tak

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

góry dziękuję

Odpowiedz

13

Co z reflect_on_association?

Model_1.reflect_on_association(:images) 

Albo reflect_on_all_associations:

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

Wielkie dzięki! Dokładnie to, czego potrzebowałem) –

0

Można tylko mieć metodę, która próbuje uzyskać dostęp do Model_1 obrazów obiektów wewnątrz bloku wyjątków jak (mniej więcej):

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

Wewnątrz ratunku możesz po prostu zwrócić false, jeśli chcesz.

+0

To może być metoda lub atrybut, lub cokolwiek. Nie stowarzyszenie. Ale tak, pisanie kaczkami :) –

1

Pewnie przydałby respond_to?

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

Prawdopodobnie pójdę z odpowiedzią KARASZI Istvána! – ktec

1

, że okazało się, że następujące z nich prosty sposób, aby osiągnąć pożądany wynik:

ModelName.method_defined?(:method_name) 

przykład:

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

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

Powiązane problemy