Search code examples
rubyoopclass-method

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


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?


Solution

  • 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