object.class在Ruby中返回意外结果

时间:2013-07-30 15:26:12

标签: ruby-on-rails ruby

我的descendants模型中有一个Question方法,用于返回从中继承的所有对象。

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 个答案:

答案 0 :(得分:3)

问题是,你已经在数组中有一个类(MultipleChoice类)。当你问Question.descendants.first时,你会得到MultipleChoice课程。

但是,您要求的是Question.descendants.first**.class**MultipleChoice的课程为Class

Class作为MultipleChoice的类完全正常。看看ruby元模型作为参考:

diagram of ruby metamodel

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

答案 1 :(得分:0)

MultipleChoice方法返回的数组中有descendants个类而不是实例。这是因为您使用ObjectSpace.each_objectClass参数,它返回类,因为它们的类是Class

答案 2 :(得分: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

的问题