Is there any way to check that has_many association exists in Rails 3.1?

11,141

Solution 1

What about reflect_on_association?

Model_1.reflect_on_association(:images)

Or reflect_on_all_associations:

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

Solution 2

I found the following to be the simple way to achieve the desired result:

ModelName.method_defined?(:method_name)

Example:

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

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

Solution 3

You could probably use respond_to?

class ActiveRecord::Base
    def self.has_many_association_exists?(related)
        self.class.associations.respond_to?(related)
    end
end
Share:
11,141

Related videos on Youtube

Babur Ussenakunov
Author by

Babur Ussenakunov

Updated on June 04, 2022

Comments

  • Babur Ussenakunov
    Babur Ussenakunov almost 2 years

    For example there are some models

    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
    

    How can I check that model has has_many association? Something like this

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

    And it can be used so

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

    Thanks in advance

  • KARASZI István
    KARASZI István over 12 years
    That could be a method, or attribute, or anything. Not an association. But yes, duck typing :)
  • ktec
    ktec over 12 years
    I'd probably go with KARASZI István's answer!
  • Babur Ussenakunov
    Babur Ussenakunov over 12 years
    Thanks a lot! Exactly what I needed)
  • Ricardo Vila
    Ricardo Vila almost 3 years
    This aproach is not fully compliant. Try it with :destroy, for example. Is not a relation but te object has this method.