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
Related videos on Youtube
Author by
Babur Ussenakunov
Updated on June 04, 2022Comments
-
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 over 12 yearsThat could be a method, or attribute, or anything. Not an association. But yes, duck typing :)
-
ktec over 12 yearsI'd probably go with KARASZI István's answer!
-
Babur Ussenakunov over 12 yearsThanks a lot! Exactly what I needed)
-
Ricardo Vila almost 3 yearsThis aproach is not fully compliant. Try it with :destroy, for example. Is not a relation but te object has this method.