假设我有一个名为Post的类,它有许多已启动的实例(即Post.new(:name => 'foo')
)。
有没有办法通过调用该类的内容来检索该类的所有实例?
我正在寻找Post.instances.all
想法?
谢谢!
答案 0 :(得分:22)
您可以使用ObjectSpace检索给定类的所有实例化对象:
posts = []
ObjectSpace.each_object Post do |post|
posts << post
end
这几乎肯定是一个坏主意 - 例如,它还将从尚未被垃圾收集的早期请求中加载仍在内存中的Post实例。可能有更好的方法来获得你关心的帖子,但我们需要更多关于你要做什么的信息。
答案 1 :(得分:19)
说明alphazero和PreciousBodilyFluids答案:
class Foo
@@instance_collector = []
def initialize
@@instance_collector << self
#other stuff
end
def self.all_offspring
@@instance_collector
end
end
a = Foo.new
b = Foo.new
p Foo.all_offspring # => [#<Foo:0x886d67c>, #<Foo:0x886d668>]
p ObjectSpace.each_object(Foo).to_a # => [#<Foo:0x886d668>, #<Foo:0x886d67c>] #order is different
答案 2 :(得分:7)
覆盖新的;保持计数;暴露财产。