[英]Rails Single Table Inheritance how to find record of child classes from querying parent class?
[英]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.