Adding table associations with Sinatra and ActiveRecord's application_controller.rb
Tags: ruby, webdev, beginners
Published: 2022-08-14 05:25:58

Hi again! Today's blog post will be about adding table associations to your API endpoints!

I was working on my project, a sewing pattern database, and I ran into a problem. More like a coding organization issue. I had my models separated as such: 
- Companies (pattern makers), 
- Patterns (individual patterns and info), 
- Categories(various categories each pattern could fall under),
- Fabrics(the type of fabrics listed on each pattern).

I had to have a fetch call for each table and it works, but I wasn't sure how to connect some tables to others. For example I asked myself "How do I access the fabrics from the pattern/fabric join table I made when I am only making a call to the patterns table?"

Well that's where this blog comes in!

My controller at the time looked something similar to this: 

```ruby
get "/patterns" do
    patterns = Pattern.all
    patterns.to_json
  end

  get "/categories" do
    categories = Category.all
    categories.to_json
  end

  get "/fabrics" do
    fabrics = Fabric.all
    fabrics.to_json
  end

 get "/patterns/:id" do
    pattern = Pattern.find(params[:id])
    pattern.to_json
  end
```

These paths are still valid because I call them to display categories and fabrics. The only path that was giving me issues was `/patterns/:id`. The way my project is structured, patterns `belongs_to` one company and `has_many` categories and fabrics `through` their respective join tables.. in this case `:pattern_categories` and `:pattern_fabrics`. However, as you see below. I am only accessing the pattern's first level of information, and not any of my patterns associations. This gave me issues when I tried to get JSON for a single pattern.

My JSON looked like this (when accessing the `/patterns/:id` path)
```json
{
id: 13,
company_id: 1,
pattern_code: "M8314",
notions: "7in zipper",
size: "XL",
yardage: 4,
extras: "Caftan-style romper and jumpsuits with sash have front opening with hook and eyes. Views B and C have opening for sash to pull through. View C has arm opening at shoulder line for a cowl drapey look and has elasticized hems.",
created_at: "2022-08-13T01:55:32.415Z",
updated_at: "2022-08-13T01:55:32.415Z",
image: "https://via.placeholder.com/150x200?text=Sewing+Pattern"
}
```

As you can see, I am missing my associations. I kept thinking "Do I need to make more fetch calls? Would I need to use a for loop to join the pattern id with the category/fabric join table and somehow search through the fabric table" I was confusing myself.

HOURS LATER

I finally asked my fellow classmates for help. Initially my friend asked why I was doing so many fetch calls? I yeeted the question.. _Whatchu talkin' bout Willis?_... it works that's why! 
But then he began to explain his process and taught me about this wonderful thing called `include`. _How'd I missed this 7 letter word that makes my life 1000x easier?_

So off to searching I went. In order to include my associations, I needed to reform my api endpoint like this:

```ruby
  get "/patterns/:id" do
    pattern = Pattern.find(params[:id])
    pattern.to_json(include: [:categories, :fabrics])
  end
```

I needed to 'include' my tables that are listed in my pattern.rb model. Annnd Just like ✨ magic ✨, my fetch now included all I needed for an individual pattern without all the extra code! This is how my JSON looks now:

```json
{
id: 13,
company_id: 1,
pattern_code: "M8314",
notions: "7in zipper",
size: "XL",
yardage: 4,
extras: "Caftan-style romper and jumpsuits with sash have front opening with hook and eyes. Views B and C have opening for sash to pull through. View C has arm opening at shoulder line for a cowl drapey look and has elasticized hems.",
created_at: "2022-08-13T01:55:32.415Z",
updated_at: "2022-08-13T01:55:32.415Z",
image: "https://via.placeholder.com/150x200?text=Sewing+Pattern",
categories: [
{
id: 3,
name: "Skirts, Pants, & Jumpsuits",
created_at: "2022-08-12T03:49:55.817Z",
updated_at: "2022-08-12T03:49:55.817Z"
},
{
id: 2,
name: "Tops & Vests",
created_at: "2022-08-12T03:49:55.798Z",
updated_at: "2022-08-12T03:49:55.798Z"
}
],
fabrics: [
{
id: 5,
name: "Cotton Blends",
created_at: "2022-08-12T03:49:56.093Z",
updated_at: "2022-08-12T03:49:56.093Z"
},
{
id: 4,
name: "Cotton",
created_at: "2022-08-12T03:49:56.077Z",
updated_at: "2022-08-12T03:49:56.077Z"
}
]
}
```

I hope this helps you! 😉