我在Rails应用程序设置中有以下模型:
# app/models/event_list/peak.rb
class EventList::Peak < AR
# ...
end
在我用于导入的gem(activerecord-import)中,以下行触发NameError
异常:
Module.const_get(class_name)
# class_name evals to :'EventList::Peak'
所以,我启动了Rails控制台并尝试通过以下方式手动获取我需要的正确符号:
Module.const_get(EventList::Peak.to_s.to_sym)
但是我得到了同样的错误。当我在控制台中输入EventList::Peak
时,我得到了正确的类对象。
我在这里错过了什么吗?
答案 0 :(得分:1)
Module::const_get
不支持任意深度;它只接收调用模块的子节点。因此,在您的情况下,EventList.const_get(Peak.to_s.to_sym)
应该有效。
您可以使用ActiveSupport
&#39; qualified_const_get
来做您要求的事情,例如:
require 'active_support/core_ext'
Module.qualified_const_get(EventList::Peak.to_s.to_sym)
如果您不想使用ActiveSupport
,您也可以这样做:
Module.const_get(EventList.to_s.to_sym).const_get(Peak.to_s.to_sym).
使用inject
创建包装器以支持任意深度并复制qualified_const_get
功能也很容易。