按名称动态获取Ruby类常量

时间:2013-09-11 22:33:31

标签: ruby oop

我有一个类API,它从第三方API中提取对象,并将它们构建为类型为APIObject的子类的对象。 APIObject个子类匹配我从中提取的API中的对象名称:

User < APIObject
Account < APIObject

我想在APIObject中定义一个类方法,允许我使用标准的Rails访问器来提取对象:

user = User.find id

我希望将此调用转换为API调用的方法如下:

API::User::findById id

我想使用User访问APIObject子类的名称(self.class.name)并使用它来调用常量(API::User),但我知道API::self.class.name不行。我可以一遍又一遍地为每个子类重写这个方法,但看起来这应该是可能的,不用这样做。建议?

1 个答案:

答案 0 :(得分:29)

我认为你正在寻找const_get。也许是这样的事情:

def self.find(id)
  API.const_get(self.name).find_by_id(id)
end

(请注意,您只需要self.name,因为这已经在课程的上下文中,而self.class.name只是Class)。