Run Services in the Background
Some time ago Marcin wrote about basic design patterns in Ruby on Rails. I’d like to go back to Service pattern in this post. I really like it, it’s a good idea to place application’s business logic there. At Naturaily we use it quite often.

Some time ago Marcin wrote about basic design patterns in Ruby on Rails. I’d like to go back to Service pattern in this post. I really like it, it's a good idea to place application’s business logic there. At Naturaily we use it quite often.
It happens that we need to run our service in the background. What's the easiest way to achieve this? Wrap our Service in a Job of course! Right... But we don't want to end up with dozens of very similar jobs. So... Here’s the solution. Let’s create universal Job for all the services.
Create the Job
Our job will be called ServiceInvocationJob
. It's a good name for our universal job. To create a new Job we need to run one simple task:
tsx
And now we should edit newly created file. Right now it looks like this:
tsx
What do we need to run some service? Service's arguments, of course, and Service class itself! We can't pass class
as argument, so we'll pass class' name. At the end our Job will be as simple as that:
tsx
Very nice? Don't you think?
Update BaseService class
We already run our services in the background jobs! Everywhere, where we want to run our service in background, we need to change classic invocation:
tsx
to this
tsx
But it doesn't look well. I think this one would be better:
tsx
Right?
So now we need to update our BaseService a bit! Nothing big. Just add a new static method called async_call
. There's the updated file:
tsx
Summary
It is very easy, nothing fancy. However, there is a hidden message: you have to be lazy and remember that future-you is also lazy! You can create code that will solve your current problem (e. g. wrapper-job for your service), it's easy and fast, you don't need to think at all. But you should think a bit more and create code that will solve your problem and prevent the emergence of similar problems in the future(e. g. our ServiceInvocationJob). Future-you will be thankful.
Thank you! Bye!
Let’s Create a Great Website Together
We'll shape your web platform the way you win it!
More posts in this category
August 26, 2025 • 15 min read
READ MOREChoosing the Right Website Platform: CMS Comparison, Scalability, and Ownership Explained
For years, we’ve witnessed architectural transformation of CMSes, and the shift from monolithic systems to decoupled, API-first architectures that define modern web development. So, the question is no longer simply "which CMS?" but rather "which architectural philosophy" best aligns with your business goals.
August 11, 2025 • 12 min read
READ MOREHow Much Does Website Development Cost and How Long Does It Take?
Planning a website development project can feel overwhelming, especially when you're trying to balance quality, functionality, and budget constraints. Understanding the real costs and timelines will help you make smart decisions and avoid expensive surprises.
July 30, 2025 • 13 min read
READ MOREHow Fast Should Your Checkout Process Be for Maximum Conversions?
Imagine losing $2.5 million in annual revenue because of a single second. Sounds dramatic? If your online business generates $100 million yearly, a mere one-second delay in your checkout process could cost you exactly that much. This is neuroscience, backed by decades of research into how the human brain processes digital experiences.