Если вы действительно храните ассоциации AR в такой строке, этот код, помещенный в инициализатор, должен позволить вам делать то, что вы хотите. Что касается меня, я не могу понять, почему ты хочешь сделать это, но я верю, что у тебя есть свои причины.
class ActiveRecord::Base
def self.has_associations?(relation_string="")
klass = self
relation_string.split('.').each { |j|
# check to see if this is an association for this model
# and if so, save it so that we can get the class_name of
# the associated model to repeat this step
if assoc = klass.reflect_on_association(j.to_sym)
klass = Kernel.const_get(assoc.class_name)
# alternatively, check if this is a method on the model (e.g.: "name")
elsif klass.instance_method_already_implemented?(j)
true
else
raise "Association/Method #{klass.to_s}##{j} does not exist"
end
}
return true
end
end
При этом вам нужно будет опустить исходное название модели, поэтому для вашего примера это будет:
Product.has_associations?("country.planet.galaxy")