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)