如何在不在Ruby中实例化A对象的情况下确定A类是否继承自B类?

时间:2011-03-06 18:55:33

标签: ruby-on-rails ruby reflection inheritance

假设我想确定Admin是否继承自ActiveRecord::Base。一种方法是Admin.new.kind_of? ActiveRecord::Base,但是实例化一个未使用的Admin对象。

是否有一种简单的方法可以在不创建Admin对象的情况下执行此操作?

由于

4 个答案:

答案 0 :(得分:27)

当然,只需比较两个类:

if Admin < ActiveRecord::Base
  # ...
end

值得注意的是,true如果Admin继承自AR::Base,则返回false,会返回nilfalse如果不是这样的话。 nil表示它是相反的,而String < Range表示不相关的类(例如nil返回{{1}})。

答案 1 :(得分:8)

这很简单:

Admin < ActiveRecord::Base
=> true

答案 2 :(得分:4)

Admin.ancestors.include? ActiveRecord::Base

嗯。嗯,这很有效,但我们学到了更好的方法。似乎Ruby's Module class定义了operator < for this purpose,而class Class派生自Module,,这意味着<将直接测试派生类。

答案 3 :(得分:3)

Admin.ancestors.includes? ActiveRecord::Base

对于直系祖先,你也可以使用

Admin.superclass == ActiveRecord::Base