Josh Frankel πŸ’ŽπŸ”›πŸ›€οΈ's Avatar

Josh Frankel πŸ’ŽπŸ”›πŸ›€οΈ

@joshfrankel

Sr. Fullstack Software Engineer @ Buoy Software Blog: https://joshfrankel.me/blog/ GitHub: https://github.com/joshmfrankel Mastodon: https://ruby.social/@JoshFrankel LinkedIn: https://linkedin.com/in/joshmfrankel/

39
Followers
34
Following
15
Posts
11.12.2024
Joined
Posts Following

Latest posts by Josh Frankel πŸ’ŽπŸ”›πŸ›€οΈ @joshfrankel

Find or Create Records with Preset Attributes using create_with I’ve been working heavily with RabbitMQ message broker infrastructure recently to coordinate events between two Rails applications. The event work involves maintaining synchronized data between specif...

Not a new #Rails feature, just something I recently learned about, the `create_with` syntax for ActiveRecord::QueryMethods. Comes in handy for cleaning up simple find_or_create_by calls within a #RabbitMQ worker. I wrote a simple explanation on its usage below

joshfrankel.me/blog/find-or...

13.01.2026 14:38 πŸ‘ 0 πŸ” 0 πŸ’¬ 0 πŸ“Œ 0
Use ActiveModel::Api for a Bare Bones Action Model interface Today, I learned that ActiveModel::Api is the minimal implementation for an object to act like a model. ActiveModel::Model was the standard prior to Rails 7. You can still use it but it implies additi...

Today, I learned that ActiveModel::Api is the minimal implementation for an object to act like a model.

joshfrankel.me/blog/use-act...

#ruby #rubyOnRails

15.12.2025 17:21 πŸ‘ 1 πŸ” 0 πŸ’¬ 0 πŸ“Œ 0
A Perfect terminal with Zsh, Antidote, Oh My Zsh, Powerlevel10k, and Mise. I love to customize my development environment. Between operating system, editor, and terminal, I’m always reading through the configuration options to improve my workflow. Getting it to look pretty i...

I’m always reading configuration options to improve my workflow. I spend so much time working with these tools that keeping them aesthetic is a priority. This article details my current setup with #Zsh, #Antidote, #OhMyZsh, Powerlevel10k, and #Mise.

joshfrankel.me/blog/a-perfe...

07.11.2025 18:03 πŸ‘ 0 πŸ” 0 πŸ’¬ 0 πŸ“Œ 0
(between images of the Spotify logo that have been crossed out) DON’T STREAM FASCISM
Spotify is treating ICE recruitment like just another ad. But when you turn family separation into a marketing pitch, you're not a platform β€” you're spreading propaganda.
β€’ Cancel your Spotify Premium subscription until Spotify removes all ICE ads
β€’ Demand Spotify immediately terminate all
ICE and DHS advertising contracts.
β€’ Urge artists and podcasters to speak out.

(between images of the Spotify logo that have been crossed out) DON’T STREAM FASCISM Spotify is treating ICE recruitment like just another ad. But when you turn family separation into a marketing pitch, you're not a platform β€” you're spreading propaganda. β€’ Cancel your Spotify Premium subscription until Spotify removes all ICE ads β€’ Demand Spotify immediately terminate all ICE and DHS advertising contracts. β€’ Urge artists and podcasters to speak out.

Spotify is running ads recruiting more ICE agents to infringe our rights and terrorize our communities, so we’re calling on users to stop paying for or using the app until Spotify stops streaming fascism: indivisible.org/cancel-spoti... #CancelSpotify

07.11.2025 17:22 πŸ‘ 3163 πŸ” 1744 πŸ’¬ 152 πŸ“Œ 97
Expecting Perfection from ActionController::Parameters Today, I learned that Rails 8 introduced a new ActionController::Parameters method called expect. This allows for cleaner and safer parameter permission and requiring. I must have just missed this in ...

Today, I learned that #Rails 8 introduced a new ActionController::Parameters method called expect. This allows for cleaner and safer parameter permitting, which is a nice quality-of-life feature to add. Check out my write-up below

joshfrankel.me/blog/expecti...

#til

20.10.2025 16:01 πŸ‘ 0 πŸ” 0 πŸ’¬ 0 πŸ“Œ 0
Using Database Functions in Ruby on Rails Migrations Today I learned you can specify PostgreSQL functions within a Ruby on Rails migrations. I found this particularly useful for setting a random default value for a database column. Let’s dig into a simp...

Quick post on using #postgresql functions within a #ruby on #rails migration. joshfrankel.me/blog/using-d...

#til

09.10.2025 14:23 πŸ‘ 0 πŸ” 0 πŸ’¬ 0 πŸ“Œ 0

Good question! My response would be, it depends. I follow the standard of General-Purpose components remaining stateless to allow composability. Application-Specific components on the other hand are targeted to a page or feature. These can be stateful, though I'm open to changing my opinion here πŸ˜€

09.10.2025 14:05 πŸ‘ 0 πŸ” 0 πŸ’¬ 0 πŸ“Œ 0
Simple Background Jobs with After in Next.js Today I learned about the after function for scheduling side effects which avoid blocking execution. Think of it as a simple background job scheduler. These are much lighter than a database or Redis b...

Today, I learned about the `after` function in #nextjs as a simple background job processor. Lighter and simpler than using #Redis or #Database backed queueing, it is ensured to execute even when an error is encountered.

joshfrankel.me/blog/simple-...

14.07.2025 18:46 πŸ‘ 2 πŸ” 0 πŸ’¬ 0 πŸ“Œ 0
Custom Naming for Database Tables, Columns, and Associations in Prisma ORM I’ve been working with Prisma as an object-relational mapping tool for my projects. Coming from a background of using raw SQL along with ActiveRecord, I’ve noticed that default Prisma caters to JavaSc...

I've been working on a project with #Next.js and #prisma. I miss the niceties provided by ActiveRecord along with PostgreSQL's best practices, so I wrote a blog post detailing how to customize tables, columns, and associations in Prisma.

joshfrankel.me/blog/custom-...

#JavaScript, #Nextjs, #Prisma

27.05.2025 15:37 πŸ‘ 2 πŸ” 0 πŸ’¬ 0 πŸ“Œ 0

joshfrankel.me/feed

Thanks for the repost today!

16.05.2025 16:12 πŸ‘ 1 πŸ” 0 πŸ’¬ 0 πŸ“Œ 0
ViewComponents, the Missing View Layer for Rails If you’ve worked with Rails for any measure of time, then you know that Rails’ Views can quickly get out of hand. Between Helpers, instance variables, and inline logic, they quickly become bloated and...

ViewComponents reduce bloat, simplify data, and create reusable frontend styling. Despite these benefits, they're often under-utilized in the Rails community. I've written a blog post refactoring a real-world example into isolated ViewComponents.

joshfrankel.me/blog/viewcom...

#ruby #rubyonrails

15.05.2025 12:56 πŸ‘ 4 πŸ” 2 πŸ’¬ 1 πŸ“Œ 0
Setting up Mac for the Linux user So you’ve got a new Mac. Maybe it’s a work laptop, maybe you are switching from another operating system. Either way, if you’re like me, you’ve got some set habits with your work environment. This art...

I'm a big fan of Linux, but most companies standardize around Mac. I wrote an article about my setup to help ease the transition from Linux to Mac

joshfrankel.me/blog/setting...

06.03.2025 01:36 πŸ‘ 1 πŸ” 0 πŸ’¬ 0 πŸ“Œ 0
Post image
27.02.2025 22:04 πŸ‘ 76524 πŸ” 23923 πŸ’¬ 1467 πŸ“Œ 1230
Preview
5 Calls Spend 5 minutes. Make 5 calls. Make your voice heard.

If you haven't already, call your representatives. It only takes 5 minutes: 5calls.org

06.02.2025 19:20 πŸ‘ 1 πŸ” 0 πŸ’¬ 0 πŸ“Œ 0

Enumerable#partition and Object#tap are both very handy

14.12.2024 18:14 πŸ‘ 1 πŸ” 0 πŸ’¬ 0 πŸ“Œ 0
Previews A framework for building reusable, testable & encapsulated view components in Ruby on Rails.

Tailwind UI (great starting point) with ViewComponents backing. πŸ‘Œ

ViewComponents have a great way to easily preview their variations as well: viewcomponent.org/guide/previe...

12.12.2024 17:58 πŸ‘ 1 πŸ” 0 πŸ’¬ 0 πŸ“Œ 0
Well-factored Data Migrations Large dataset migrations are always an adventure. A well factored data migration considers: Performance, Accuracy, Reversibility, and Repeatability. Each of these supports a successful data migration....

I wrote a blog post on my philosophy for a well-factored data migration. Traditional migrations don't need testing; data migrations can and SHOULD be tested.

joshfrankel.me/blog/well-fa...

#ruby #sql #rubyonrails

12.12.2024 15:58 πŸ‘ 2 πŸ” 0 πŸ’¬ 0 πŸ“Œ 0