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")
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.
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
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.
One more method to bring all this together. The self keyword refers to the owner we're calling on.
pet.owner = self
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!
Top comments (0)