How do I list all objects created from a class in Ruby?

Amit Erandole picture Amit Erandole · Jan 14, 2013 · Viewed 17.6k times · Source

Is there any way in Ruby for a class to know how many instances of it exist and can it list them?

Here is a sample class:

class Project

  attr_accessor :name, :tasks

  def initialize(options)
    @name = options[:name]
    @tasks = options[:tasks]
  end

  def self.all
    # return listing of project objects
  end

    def self.count
          # return a count of existing projects
    end


end

Now I create project objects of this class:

options1 = {
  name: 'Building house',
  priority: 2,
  tasks: []
}

options2 = {
  name: 'Getting a loan from the Bank',
  priority: 3,
  tasks: []
}

@project1 = Project.new(options1)
@project2 = Project.new(options2)

What I would like is to have class methods like Project.all and Project.count to return a listing and count of current projects.

How do I do this?

Answer

Andrew Haines picture Andrew Haines · Jan 14, 2013

You can use the ObjectSpace module to do this, specifically the each_object method.

ObjectSpace.each_object(Project).count

For completeness, here's how you would use that in your class (hat tip to sawa)

class Project
  # ...

  def self.all
    ObjectSpace.each_object(self).to_a
  end

  def self.count
    all.count
  end
end