Получить динамический класс Ruby по имени

У меня есть API класса, который вытягивает объекты из стороннего API и создает их в объекты, которые являются подклассами типа APIObject. Подклассы APIObject соответствуют именам объектов API, из которых я извлекаю:

User < APIObject
Account < APIObject

Я хотел бы определить метод класса в APIObject, который позволяет мне тянуть объекты с помощью стандартных Rails-аксессуаров:

user = User.find id

Я хотел бы, чтобы этот метод переводил этот вызов в вызов API следующим образом:

API::User::findById id

Я хотел бы получить доступ к имени подкласса APIObject (User) с помощью self.class.name и использовать его для вызова константы (API::User), но я знаю, что API::self.class.name не будет работать. Я мог бы переписать этот метод снова и снова для каждого подкласса, но, похоже, это возможно, если этого не сделать. Предложения?

Ответ 1

Я думаю, что вы ищете const_get. Возможно, что-то вроде:

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

(обратите внимание, что вам нужно только self.name, так как это уже относится к классу, а self.class.name будет только Class).