获取子类的从单表继承Rails中列表/阵列?(Get a list/array of child c

2019-07-29 07:54发布

我有一大堆,从我的Rails应用程序通过单表继承父类继承的子类。 我想办法让从主类继承的所有子类的数组。

我想,我在另一个发现SO回答以下单链路的命令,但它只返回父类。

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

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

编辑:显然,Rails的,只有当调用开发模式懒加载子类,并可能生产根据Rails的版本。 然而,第一个答案应该on Rails的3.1工作,并在PROD模式更高。

Answer 1:

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

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


Answer 2:

导轨延伸的Ruby Class与亚类()方法。

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

YourClass.subclasses

在Rails 2.3,“.subclasses”是受保护的,所以我们使用在使用调用它send()

YourClass.send(:subclasses)


Answer 3:

你需要贪婪加载的类,如说: https://github.com/rails/rails/issues/3364

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

然后你就可以使用:

YourClass.subclasses

要么

YourClass.descendants


Answer 4:

ParentClass.subclasses.map(&:name)


Answer 5:

在你的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]


Answer 6:

这将做一个SQL查询:

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


Answer 7:

请注意,他们是执行上面的戴维G公司的方法更有效的方法..

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

此第一发送编组对象仅具有从DB,这需要更少的WAY存储器中的“type”属性,则仅拨弄类型到一个数组,然后可以uniq的上。 我敢肯定有一个无限更高效的纯SQL的方式来做到这一点,虽然。



文章来源: Get a list/array of child classes from Single Table Inheritance in Rails?