DEV Community

Donna Amos
Donna Amos

Posted on

OO Ruby Concepts Part 3, Object Relationships

alt text

Last post we gave an object its attributes so it can become its own entity. But the object we made, Garfield, can't interact with any other objects. That's where object relationships comes in. If objects are modeling real world entities, they need to have a method to know who they belong to. This method is called "belongs to". Let's start with building the "Garfield" object.


class Cat #object 
     attr_accessor :name # gives the object a name

   def initialize(name) # Initialize method means the name attribute is called when #new is called 
     @name = name 
   end 
end 

garfield = Cat.new("Garfield") 


Enter fullscreen mode Exit fullscreen mode

Now that we have made a cat object, Garfield, we need to give him an owner. Who else will feed him lasagna?


class Owner #object 
     attr_accessor :name, :job # attributes about the object 

  def initialize(name, job) # Initialize method means the name and job attributes
    @name = name            # are called when #new is called.  
    @job = job 
  end 
end 

 jon = Owner.new("Jon", "cartoonist") # new method names the Owner, Jon, 
                                      # and gives him a job, cartoonist  

 garfield.owner = jon # Congrats! Now Garfield belongs to Jon. 

Enter fullscreen mode Exit fullscreen mode

Now Garfield knows that he belongs to Jon. However, what if Jon wanted another pet? In the real world, he can own as many pets as he wants. He's decided to get a dog. How do we give Jon another pet?

With a method is called the "has many" relationship. It allows an object to have many objects and relate to one another. In this example, it allows the Owner, Jon, to have two pets. And any more if he wants them.


Class Owner 
   attr_accessor :name, :job 

 def initialize(name, job) 
   @name = name 
   @job = job 
   @pets = [] # this empty array is where all Jon's pets will go 
 end 

 def add_pet(pet) # this method allows Jon to add as many pets as he wants
   @pets << pet # the shovels(<<) push the pet class we've created into the array
 end 

 def pets # this method simply returns the @pets array when it is called
   @pets 
 end 
end 

 jon.pets # => ["Garfield", "Odie"] this is the pets array when it is called


Enter fullscreen mode Exit fullscreen mode

Now we need to make an Object called Pet that we can use to give Jon more pets when this method is called.


class Pet 
       attr_accessor :name, :species  

   def initialize(name, species)
    @name = name 
    @species = species 
   end 
end 

  odie = Pet.new("Odie", "dog") # "Odie" is the name, "dog" is the species
  garfield = Pet.new("Garfield", "cat") # Congrats! Jon can now adopt his two pets.

Enter fullscreen mode Exit fullscreen mode

One more method to bring all this together. The self keyword refers to the owner we're calling on.


   pet.owner = self 


Enter fullscreen mode Exit fullscreen mode

Add this to the add_pet method so we can call the self keyword to let the pet know who his owner is.


Class Owner 
   attr_accessor :name, :job 

 def initialize(name, job) 
   @name = name 
   @job = job 
   @pets = [] 
 end 

 def add_pet(pet) 
   @pets << pet 
   pet.owner = self # self keyword 
 end 

 def pets 
   @pets 
 end 
end 


 jon.add_pet(garfield) # calling the add_pet method 

 garfield.owner.name # => "Jon", Garfield knows Jon is his owner 

 jon.add_pet(odie) 

 odie.owner.name # => "Jon", Odie knows Jon is his owner 

 # Now Jon has two pets and they know they belong to him!

Enter fullscreen mode Exit fullscreen mode

Top comments (0)