簡體   English   中英

從Rails中的單表繼承獲取子類的列表/數組?

[英]Get a list/array of child classes from Single Table Inheritance in Rails?

我有一大堆子類,通過我的Rails應用程序中的單表繼承從父類繼承。 我想要一種方法來獲取從主類繼承的所有子類的數組。

我嘗試了在另一個SO答案中找到的以下單鏈接命令,但它只返回父類。

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

有沒有干凈的方法來做到這一點?

編輯:顯然Rails只在惰性模式下調用延遲加載子類,並且可能根據Rails版本生成。 但是,第一個答案應該適用於Prod模式下的Rails 3.1及更高版本。

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

這首先發送只有來自數據庫的“type”屬性的封送對象,這會占用更少的內存,然后只將類型提取到一個數組中,然后可以單獨使用。 我確信有一種無限高效的純SQL方法可以做到這一點。

假設表中至少有一個對象存在:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM