从Rails中的单表inheritance获取子类的列表/数组?

我有一大堆子类,它们通过我的Rails应用程序中的单表inheritance从父类inheritance。 我想要一种方法来获取从主类inheritance的所有子类的数组。

我尝试了在另一个SO答案中找到的以下单链接命令,但它只返回父类。

ObjectSpace.each_object(class<<MyParentClass;self;end) 

有没有干净的方法来做到这一点?

编辑:显然Rails只在惰性模式下调用延迟加载子类,并且可能根据Rails版本生成。 但是,第一个答案应该适用于Prod模式下的Rails 3.1及更高版本。

假设表中至少有一个对象存在:

 Object.all.uniq{|x| x.type}.collect(&:type) 

Rails使用subclasses()方法扩展Ruby Class

在Rails 3中,您可以直接调用它:

 YourClass.subclasses 

在Rails 2.3中,“。subclasses”受到保护,因此我们必须使用send()来调用它:

 YourClass.send(:subclasses) 

您需要急切加载类,如下所述: https : //github.com/rails/rails/issues/3364

 ActionDispatch::Reloader.to_prepare do Rails.application.eager_load! end 

然后你就可以使用:

 YourClass.subclasses 

要么

 YourClass.descendants 
 ParentClass.subclasses.map(&:name) 

config / environments / development.rb中

 Rails.application.configure do config.eager_load = false end 

你可以将false改为true ,然后在你的控制台中做

 Class.subclasses 

要么

 Class. descendants 

这是子类后代之间的区别

子类:

 class Foo; end class Bar < Foo; end class Baz < Bar; end Foo.subclasses # => [Bar] 

后人:

 class C; end C.descendants # => [] class B < C; end C.descendants # => [B] class A < B; end C.descendants # => [B, A] class D < C; end C.descendants # => [B, A, D] 

这将在一个SQL查询中执行:

 # SELECT DISTINCT type FROM objects Object.uniq.pluck(:type) 

注意,它们是实现上述Dave G方法的更有效方法。

 Object.select(:type).map(&:type).uniq 

这首先发送只有来自DB的“type”属性的封送对象,这样可以减少内存,然后只将类型提取到一个数组中,然后可以单独使用。 我确信有一种无限高效的纯SQL方法可以做到这一点。