按名称动态获取Ruby类常量

kid*_*rew 13 ruby oop

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

User < APIObject
Account < APIObject
Run Code Online (Sandbox Code Playgroud)

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

user = User.find id
Run Code Online (Sandbox Code Playgroud)

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

API::User::findById id
Run Code Online (Sandbox Code Playgroud)

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

mat*_*att 31

我想你在找const_get.也许是这样的:

def self.find(id)
  API.const_get(self.name).find_by_id(id)
end
Run Code Online (Sandbox Code Playgroud)

(注意你只需要self.name,因为这已经在类的上下文中,并且self.class.name只是Class).