【发布时间】:2011-06-15 23:30:53
【问题描述】:
假设我有一个名为 Post 的类,它有许多已启动的实例(即 Post.new(:name => 'foo'))。
有没有办法通过调用某个类来检索该类的所有实例?
我正在寻找类似于Post.instances.all
【问题讨论】:
-
您可能可以手动存储从构造函数更新的参考列表...但我很好奇您为什么需要这样做?
标签: ruby ruby-on-rails-3
假设我有一个名为 Post 的类,它有许多已启动的实例(即 Post.new(:name => 'foo'))。
有没有办法通过调用某个类来检索该类的所有实例?
我正在寻找类似于Post.instances.all
【问题讨论】:
标签: ruby ruby-on-rails-3
您可以使用ObjectSpace 检索给定类的所有实例化对象:
posts = []
ObjectSpace.each_object Post do |post|
posts << post
end
这几乎肯定是个坏主意,但是 - 例如,它还会从尚未被垃圾收集的早期请求加载仍在内存中的 Post 实例。可能有更好的方法来获取您关心的帖子,但我们需要更多关于您想要做什么的信息。
【讨论】:
说明 alphazero 和 PreciousBodyFluids 的答案:
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
【讨论】:
@@instance_collector会被更新吗?
覆盖新的;数数;暴露财产。
【讨论】: