2010-06-26 2 views
2

Я пытаюсь получить имя класса объекта. Когда я попытался использовать const_get, я получаю всю структуру таблицы модели. Поэтому я использовал следующий код.Извлечение имени класса из объекта в Ruby

Код

def classname(object) 
    return object.class.to_s.split("(")[0] 
    end 

    def classrating(object_id) 
    classtype = classname(object_id) 
    return classtype 
    end 

Script/Консоль

>> q = Question.new 
    => #<Question id: nil, question_info: nil, profile_id: nil, rating: nil, created_at: nil, updated_at: nil> 
    >> Question.classname(q) 
    => "Question" 
    >> Question.classrating(Question.classname(q)) 
    => "String" 
    >> q.class 
    => Question(id: integer, question_info: string, profile_id: integer, rating: integer, created_at: datetime, updated_at: datetime) 

Как вы можете видеть, когда Question.classname называется, он возвращает вопрос и, когда тот же вход я назвал Вопроса .classrating, он возвращает String. Я просто возвращаю тот же результат из Question.classname.

Не могли бы вы рассказать мне, что я делаю неправильно, что значение изменилось.

Спасибо.

ответ

1

Во-первых, classrating фактически совпадает с classname. Таким образом, вы в основном делаете:

classname(classname(Question.new)) 

Вы возвращенное имя класса имени класса q. q - Question, поэтому имя класса "Question". "Question" - String, поэтому его имя класса "String".

1

Question.classname возвращает строку «Вопрос». Тип этой строки, очевидно, является строкой. Это то, о чем вы спрашиваете?

0

Код неправ. Я не должен иметь метод classname в классе class.Damn: D. Извините

8

Прежде всего, вы можете просто использовать object.class.name, чтобы получить имя класса объекта в виде строки.

Причина, по которой ваш второй вызов возвращает «Строка» просто, что вы называете Question.classname(q), который возвращает "Question", а затем вы называете Question.classrating("Question"), который возвращает «Строка», потому что "Question" является строкой.

+0

Спасибо большое :) – felix

Смежные вопросы