Active Record TV Land Lab

Learning Goals

  • Create and modify tables using Active Record migrations
  • Build associations between models using Active Record macros

Introduction

In this lab, we'll be working with a TV show domain model. We will have a show, network, and character model. They will be associated in the following way:

  • An actor has many characters and has many shows through characters.
  • A character belongs to an actor and belongs to a show.
  • A show has many characters and has many actors through characters.

Here's what the completed ERD will look like after you've created the additional migrations:

TVLand ERD

We've given you a few migrations in the db/migrate directory to create the networks and shows table, but you'll have to add additional tables and modify these existing tables as per the guidelines below.

Instructions

Note: This lab is test-driven, but in order for the tests to run correctly, you need to complete all of the migration files before running learn test. The first three migration files have been done already. You only need to work on the 004, 005 and 006 migrations.

Once you've completed the migrations and have the first set of tests passing, work on building out methods in the classes. Make sure to use the Active Record association macros like has_many and belongs_to. Remember, using these macros creates instance methods on your classes, so to pass some of the tests, the macros will be enough! You'll also have to write out some custom methods as well.

Migrations

004_create_actors

Write a migration to create the actors table. An actor should have a first_name and a last_name as strings.

005_create_characters

Write a migration to create the characters table. A character should have a name (string), actor_id (integer), and a show_id (integer).

A character will belong to a show (the show migration is already provided) and an actor, and we'll keep track of this relationship with these database table columns.

006_add_catchphrase_to_characters

Write a migration that adds the column catchphrase as a string to your characters table.

Once you've completed all three migrations, go ahead and run learn test to see what you need to do for the models.

Model Methods

Character

  • #actor: should return the actor instance this character belongs to. Hint: is there an association macro you can use to create this method?

  • #show: should return the show instance this character belongs to. Hint: is there an association macro you can use to create this method?

  • #say_that_thing_you_say: Define a method in the Character class, #say_that_thing_you_say, using a given character's catchphrase. Using Tyrion as an example again, the returned string should look like the following:

    tyrion.catchphrase = 'A Lannister always pays his debts'
    tyrion.say_that_thing_you_say
    #=> 'Tyrion Lannister always says: A Lannister always pays his debts'

Actor

  • #characters: an actor has many characters, so write code that creates an instance method that will return all the characters that the actor has played. Hint: is there an association macro you can use to create this method?

  • #shows: an actor should have many characters and many shows through characters. Write code that creates an instance method that returns all the shows for the actor. Hint: is there an association macro you can use to create this method?

  • #full_name: Write a method in the Actor class, #full_name, that returns the first and last name of an actor.

  • #list_roles: Write a method in the Actor class, #list_roles, that lists all of the characters that actor has alongside the show that the character is in.

    So, for instance:

    peter = Actor.create(first_name: "Peter", last_name: "Dinklage")
    thrones = Show.create(name: "Game of Thrones")
    tyrion = Character.create(name: "Tyrion Lannister", actor_id: peter.id, show_id: thrones.id)
    
    peter.list_roles
    # ['Tyrion Lannister - Game of Thrones']

    Notice that when we run peter.list_roles, we get an Array containing a string with both the character and the show.

Show

  • #characters: should return a list of all the character instances associated with the show.
  • #network: should return the network instance this show belongs to
  • #actors_list: Define a method in the Show class called #actors_list that returns an Array of the full names of each actor associated with a show. Remember, a show should have many actors through characters. Hint: it may help to use another association macro to access the actors for the show.

Network

  • #shows: should return a list of all the show instances associated with the network.
  • #sorry: returns a string "We're sorry about passing on John Mulaney's pilot".

Resources