lib/dbee/dsl/association.rb in dbee-2.0.1 vs lib/dbee/dsl/association.rb in dbee-2.0.2
- old
+ new
@@ -39,15 +39,28 @@
def class_name
opts[:model] || relative_class_name
end
+ # This will automatically prefix the name of the module within the current classes
+ # hierarchy. If the class does not happen to be in the same namespace then it needs
+ # to be explicitly set in the association using 'model' option.
def relative_class_name
(on_class_name.split('::')[0...-1] + [inflector.classify(name)]).join('::')
end
+ # Only use Module constant resolution if a string or symbol was passed in.
+ # Any other type is defined as an acceptable constant and is simply returned.
def constantize(value)
- value.is_a?(String) || value.is_a?(Symbol) ? Object.const_get(value) : value
+ value.is_a?(String) || value.is_a?(Symbol) ? object_constant(value) : value
+ end
+
+ # If the constant has been loaded, we can safely use it through const_get.
+ # If the constant has not been loaded, we need to defer to const_missing to resolve it.
+ # If we blindly call const_get, it may return false positives for namespaced constants
+ # or anything nested.
+ def object_constant(value)
+ Object.const_defined?(value) ? Object.const_get(value) : Object.const_missing(value)
end
end
end
end