BOISE CODE CAMP 2026
Rails · TypeORM · Sequelize · Prisma · JPA/Hibernate
@nerajno · developingdvlpr.com
0 – 8 min
Why developers struggle — and the mental model that changes everything
8 – 32 min
belongs_to · has_one · has_many · :through · habtm — code + real life
32 – 42 min
Cross-ORM reference · mapping your network · key options
42 – 47 min
3 concrete things to do before you leave this room
The Setup · 0 – 8 min
Raise your hand if you've said this.
Most developers think networking is schmoozing.
Day Job
Vue 3 · TypeScript · Nuxt · Supabase · Tailwind
Community
600+ members · built & grew the community
Speaking
ADC · Nebraska.Code() · and more
Disclaimer
Everything I share today reflects my personal experience and perspective as a developer — not the views of my employer, clients, or any organization I'm affiliated with.
Code examples are for educational purposes. Your production mileage may vary.
Questions, pushback, and hot takes welcome. Scan to find me after the talk →
developingdvlpr.com
The Core Insight
Every person you know is a record.
Every relationship has a type.
The foreign key tells you who carries the responsibility.
| Association | Cardinality | Career Translation | FK Lives On |
|---|---|---|---|
belongs_to | 1 : 1 | Intentional 1-on-1 connections | Your table |
has_one | 1 : 1 | Mentorship — you are the anchor | Their table |
has_many | 1 : N | Groups, audiences, communities | Their table (many) |
has_many :through | M : N | Warm introductions via join model | Join model |
habtm | M : N | Community membership — mutual | Join table (no model) |
Thank You to Our Sponsors
Sponsor Logo
Sponsor Logo
Sponsor Logo
Boise Code Camp 2026 would not be possible without the support of our sponsors.
Please take a moment to connect with them and show them some love.
Code of Conduct
Scan to read the full Boise Code Camp Code of Conduct →
boisecodecamp.org/code-of-conduct
Association 1 of 5
You hold the foreign key. You carry the responsibility.
You chose this relationship. You carry it.
Your direct manager
You report to one person. You hold that link.
Your assigned mentor
One official mentor at a time.
Accountability partner
Intentional, singular, committed.
Coffee chat you scheduled
You reached out. The FK is on your table.
You made the commitment. You carry it. Send the message — actual ask, actual day, actual time.
# Rails
class Post < ApplicationRecord
belongs_to :user
# user_id on posts table
end
# Sequelize
Post.belongsTo(User, {
foreignKey: 'userId'
});
// TypeORM
@ManyToOne(() => User)
@JoinColumn()
author: User;
// Prisma
model Post {
author User
authorId Int
@relation(fields:[authorId],
references:[id])
}
// JPA
@ManyToOne
@JoinColumn(name="user_id")
private User author;
Association 2 of 5
They hold the FK back to you. You are the anchor.
You created the seat. They reference you.
Senior dev has_one mentee
They reference you. You created the seat.
Team lead sponsoring one report
Their FK points to your reputation.
Conference has_one keynote speaker
One anchor per event. High trust, high signal.
Your flagship project
The work that defines your brand references you.
Good mentorship is structured — goals, check-ins, honest feedback. Not just vibes. Refactor if the match is wrong.
# Rails
class User < ApplicationRecord
has_one :profile
# profile.user_id → users.id
end
# Sequelize
User.hasOne(Profile, {
foreignKey: 'userId'
});
// TypeORM
@OneToOne(() => Profile)
profile: Profile;
// Prisma
model User {
profile Profile?
}
// JPA
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn
private Profile profile;
Association 3 of 5
You are the hub. The collection grows every time you show up.
1
Conference talk
= dozens of new FKs pointing to you
1
Meetup you run
= 30–80 people in your has_many
1
Blog post that lands
= thousands of records referencing you
Atlanta freeCodeCamp
Built it. 600+ records. They all FK to the community.
This room, right now
One talk → many audience records created.
Vue Mastery content
Students worldwide referencing your work.
Open source projects
Every contributor has a FK to your repo.
The collection only grows if you keep showing up. No passive has_many relationships exist.
# Rails
class User < ApplicationRecord
has_many :posts
has_many :mentees,
class_name: "Developer"
end
# Sequelize
User.hasMany(Post, {
foreignKey: 'userId'
});
// TypeORM
@OneToMany(() => Post, p => p.author)
posts: Post[];
// Prisma
model User {
posts Post[]
}
// JPA
@OneToMany(mappedBy = "author")
private List<Post> posts;
Association 4 of 5 — The Most Powerful
You reach new people through an existing relationship. The join model is the warm introduction.
❄️ Cold Connection
🔥 Warm Introduction
The :through model is the warm introduction. It carries the data cold connections never have.
# Rails — Introduction (your join model)
class Introduction < ApplicationRecord
belongs_to :introducer, class_name: "Developer"
belongs_to :new_contact
# Data a cold LinkedIn request NEVER carries:
# context: "Met at Connect.Tech 2024, Vue.js talk"
# trust_level: :warm_intro
# shared_interests: ["Vue.js", "frontend", "community"]
end
class Developer < ApplicationRecord
has_many :introductions, foreign_key: :introducer_id
has_many :new_contacts, through: :introductions
end
habtm has no story. :through HAS a story. Choose based on whether the introduction matters.
| The :through model (the warm intro) | → You can now reach |
|---|---|
| Co-organizer role @ Connect.Tech | New conference speakers & sponsors |
| Former colleagues | Referrals, job leads, insider info |
| Vue Mastery content | Students & developers worldwide |
| Conference talk appearances | Hiring managers & senior peers |
| Open source PRs | International dev community |
| Meetup organization | Every speaker you've ever invited |
List one person you want to meet. Who could introduce you? Have you given them enough reason to do it?
# Rails
class Doctor < ApplicationRecord
has_many :appointments
has_many :patients,
through: :appointments
end
# Sequelize
Doctor.belongsToMany(Patient, {
through: 'Appointment'
});
// TypeORM
@ManyToMany(() => Patient)
@JoinTable() // custom entity for data
patients: Patient[];
// Prisma (explicit join model)
model Appointment {
doctor Doctor
patient Patient
at DateTime
@@id([doctorId, patientId])
}
// JPA
@ManyToMany
@JoinTable(name="appointments")
List<Patient> patients;
Association 5 of 5
Mutual membership. No join model. No story needed. Just presence.
Where This Idea Comes From
Vincent Mayers gave a talk at DevBCN 2023 that I keep coming back to.
"Communities affect our lives from an early age. It could be a church group, a book club, or a sports team. The fundamentals are the same worldwide, regardless of your involvement."
— Vincent Mayers (@vrm) · DevBCN 2023
His framing of community as a universal, cross-cultural pattern is the foundation of the habtm section you're about to see.
👉 mayers.io/blog/f/three-cups-of-java---devbcn-2023
Atlanta freeCodeCamp
You're a member. That's the whole record.
Conference speaker circuit
You speak at many. They have many speakers.
Dev Discord servers
You joined. That's the entire relationship.
Vue / React dev community
Mutual presence. Shared tech identity.
Pick 3–5 communities and actually show up. You can't be present in 40.
Does the connection itself have a story?
| Question | habtm | has_many :through |
|---|---|---|
| How did they meet? | ❌ No record | ✅ context field |
| When was trust established? | ❌ Unknown | ✅ timestamps |
| Who made the introduction? | ❌ No attribution | ✅ introducer FK |
| Any shared experience? | ❌ Just overlap | ✅ shared_interests |
| Need more data later? | ❌ Locked out | ✅ just add columns |
YES to any row → use has_many :through. Default to :through when trust matters.
Putting It Together · 32 – 42 min
| Concept | Rails | TypeORM | Sequelize | Prisma | JPA |
|---|---|---|---|---|---|
| Many-to-one | belongs_to | @ManyToOne | belongsTo | @relation | @ManyToOne |
| One-to-many | has_many | @OneToMany | hasMany | array field | @OneToMany |
| One-to-one | has_one | @OneToOne | hasOne | @relation + ? | @OneToOne |
| Many-to-many | habtm / :through | @ManyToMany | belongsToMany | implicit/explicit | @ManyToMany |
Master the pattern — not the syntax. The concept is identical across every ecosystem.
belongs_to
Direct Manager · Mentor
has_one
Mentee · Sponsoree
has_many
Readers · Attendees · Students
:through
Hiring Mgrs · New Speakers · Leads
habtm
Communities · Conferences · Stacks
Every node has a type. Every edge has a direction. Design with intention.
dependent: :destroy
What happens to your mentees when you exit a company or community?
through: :join_model
The colleague who made the introduction — that IS your :through model.
counter_cache: true
Talk count, mentee count, blog count — tracked automatically as you grow.
scope: -> { active }
Only count people who are still engaged, still in your active network.
The Big Takeaway
has_many :throughBecause real career growth comes through existing relationships — not from scratch.
Warm introductions carry trust. Cold connections carry nothing.
Action Plan · 42 – 47 min
belongs_toWho do you intentionally belongs_to right now?
Manager, mentor, accountability partner — did you choose them, or did they happen by default?
A default belongs_to is the most expensive N+1 in your career.
:through ModelsList 3 people you want to meet.
For each one — who in your current network could make the warm introduction?
Earn the right to the ask. That's has_many :through.
habtm CommunityPick one community you've been lurking in.
Go from lurker to participant. This week.
Attend
Show up. Being there adds a record.
Contribute
Answer a question. Comment. Help someone.
Ship something
Share a project. Write a post. Give a talk.
Connect
Exchange info. Start building :through potential.
This talk + blog
developingdvlpr.com/blog
Slide deck · companion doc · full post
Find a has_one
ADPList.org · MentorCruise.com
Free and paid mentorship platforms
Rails Associations
guides.rubyonrails.org/
association_basics.html
Community (habtm)
Atlanta freeCodeCamp meetups
Connect.Tech conference
Related posts
"How !To Be Mentored V2"
"Developer Networking Tools: IRL"
Build the habit
Atomic Habits — James Clear
Consistent showing up is everything
What association type is your biggest gap right now?
DMs open. Always.
developingdvlpr.com
"Build your schema intentionally.
Know which side of each relationship you're on.
And show up accordingly."
@nerajno · developingdvlpr.com
Leave feedback →