Learn-skills.dev rails-jobs-patterns
ActiveJob and background processing patterns for Rails. Automatically invoked when working with background jobs, Sidekiq, async processing, job queues, scheduling, or the app/jobs directory. Triggers on "job", "background job", "ActiveJob", "Sidekiq", "async", "queue", "perform_later", "worker", "scheduled job", "cron", "retry", "idempotent".
install
source · Clone the upstream repo
git clone https://github.com/NeverSight/learn-skills.dev
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/NeverSight/learn-skills.dev "$T" && mkdir -p ~/.claude/skills && cp -r "$T/data/skills-md/ag0os/rails-dev-plugin/rails-jobs-patterns" ~/.claude/skills/neversight-learn-skills-dev-rails-jobs-patterns && rm -rf "$T"
manifest:
data/skills-md/ag0os/rails-dev-plugin/rails-jobs-patterns/SKILL.mdsource content
Rails Background Job Patterns
Patterns for building reliable, efficient background jobs in Rails applications.
When This Skill Applies
- Creating background jobs with ActiveJob
- Configuring Sidekiq queues and workers
- Implementing idempotent job patterns
- Error handling and retry strategies
- Batch processing large datasets
- Scheduling recurring jobs
Core Principles
Idempotency
Jobs should be safe to run multiple times:
def perform(order_id) order = Order.find(order_id) return if order.processed? # Guard against re-processing order.with_lock do return if order.processed? process_order(order) order.update!(status: 'processed') end end
Small, Focused Jobs
- Single responsibility per job
- Pass IDs, not objects (serialization)
- Keep payloads minimal
Error Handling
- Use
for transient failuresretry_on - Use
for permanent failuresdiscard_on - Log errors with context
Quick Reference
| Pattern | Use When |
|---|---|
| Transient errors (network, timeout) |
| Permanent failures (record deleted) |
| Preventing concurrent execution |
| Batch processing | Large datasets |
| Result tracking | Job status reporting |
Detailed Documentation
- patterns.md - Complete job patterns with examples
Basic Job Structure
class ProcessOrderJob < ApplicationJob queue_as :default retry_on ActiveRecord::RecordNotFound, wait: 5.seconds, attempts: 3 discard_on ActiveJob::DeserializationError def perform(order_id) order = Order.find(order_id) OrderProcessor.new(order).process! end end
Queue Configuration
# config/sidekiq.yml :queues: - [critical, 6] - [default, 3] - [low, 1]
Testing Jobs
RSpec.describe ProcessOrderJob, type: :job do include ActiveJob::TestHelper it 'processes the order' do order = create(:order) expect { ProcessOrderJob.perform_now(order.id) }.to change { order.reload.status }.from('pending').to('processed') end it 'enqueues in the correct queue' do expect { ProcessOrderJob.perform_later(1) }.to have_enqueued_job.on_queue('default') end end