如何在Ruby中获取类实例?

Yuv*_*rmi 12 ruby ruby-on-rails-3

假设我有一个名为Post的类,它有许多启动的实例(即Post.new(:name => 'foo')).

有没有办法通过调用它上面的东西来检索该类的所有实例?我正在寻找一些类似的东西Post.instances.all

想法?

谢谢!

Pre*_*ids 22

您可以使用ObjectSpace来检索给定类的所有实例化对象:

posts = []
ObjectSpace.each_object Post do |post|
  posts << post
end
Run Code Online (Sandbox Code Playgroud)

这几乎肯定是一个坏主意 - 例如,它还将加载尚未被垃圾收集的早期请求仍在内存中的Post实例.可能有更好的方法来获得您关注的帖子,但我们需要更多关于您尝试做什么的信息.


ste*_*lag 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
Run Code Online (Sandbox Code Playgroud)


alp*_*ero 7

覆盖新; 保持计数; 暴露财产.