2013-07-30 43 views
0

我在我的Question模型中有一個descendants方法來返回所有繼承它的對象。object.class在Ruby中返回意外的結果

class Question < ActiveRecord::Base 
    class << self 
    def descendants 
     ObjectSpace.each_object(Class).select do |klass| 
     klass < self 
     end 
    end 
    end 
end 

當我打電話Question.descendants我回來數組瓦特/單個對象

[MultipleChoice(id: integer, text: text, scored: boolean, required: boolean, type: string, questionnaire_id: integer, created_at: datetime, updated_at: datetime)] 

的問題是,當我叫Question.descendants.first.class我回來Class而不是預期的MultipleChoice

這是怎麼發生的?

回答

3

問題是,您已經在數組中有一個類(MultipleChoice類)。當你詢問Question.descendants.first時,你會得到MultipleChoice類。但是,您要求Question.descendants.first**.class**。並且MultipleChoice的類別是Class

獲得Class作爲MultipleChoice的等級是完全正常的。看看紅寶石元模型作爲參考:

diagram of ruby metamodel

圖片來源:http://sermoa.wordpress.com/2011/06/19/ruby-classes-and-superclasses/

0

你有MultipleChoice類,而不是由descendants方法返回數組中的實例。這是因爲您使用ObjectSpace.each_objectClass參數,該參數返回類,因爲它們的類是Class

0
[MultipleChoice(id: integer, text: text, scored: boolean, required: boolean, type: string, questionnaire_id: integer, created_at: datetime, updated_at: datetime)] 

這不是單個對象的數組。這是一個你有類似[MultipleChoice]的數組。當您嘗試MultipleChoice.class時,它將返回Class

您的代碼中存在一些問題,它會創建Question.descendants