我有一大堆,从我的Rails应用程序通过单表继承父类继承的子类。 我想办法让从主类继承的所有子类的数组。
我想,我在另一个发现SO回答以下单链路的命令,但它只返回父类。
ObjectSpace.each_object(class<<MyParentClass;self;end)
有没有干净的方式做到这一点?
编辑:显然,Rails的,只有当调用开发模式懒加载子类,并可能生产根据Rails的版本。 然而,第一个答案应该on Rails的3.1工作,并在PROD模式更高。
我有一大堆,从我的Rails应用程序通过单表继承父类继承的子类。 我想办法让从主类继承的所有子类的数组。
我想,我在另一个发现SO回答以下单链路的命令,但它只返回父类。
ObjectSpace.each_object(class<<MyParentClass;self;end)
有没有干净的方式做到这一点?
编辑:显然,Rails的,只有当调用开发模式懒加载子类,并可能生产根据Rails的版本。 然而,第一个答案应该on Rails的3.1工作,并在PROD模式更高。
假设有每个在表中对象的现存的至少一个:
Object.all.uniq{|x| x.type}.collect(&:type)
导轨延伸的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 /环境/ development.rb
Rails.application.configure do
config.eager_load = false
end
U可以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)
请注意,他们是执行上面的戴维G公司的方法更有效的方法..
Object.select(:type).map(&:type).uniq
此第一发送编组对象仅具有从DB,这需要更少的WAY存储器中的“type”属性,则仅拨弄类型到一个数组,然后可以uniq的上。 我敢肯定有一个无限更高效的纯SQL的方式来做到这一点,虽然。