Ruby on Rails 8: How to Batch with Custom Columns

Rails 8 lets in_batches cursor on columns other than the primary key. What that changes for multi-tenant data and large migrations.

Ruby on Rails 8: How to Batch with Custom Columns

Ruby on Rails 8 introduces a handy feature for developers handling large datasets: batching with custom columns. This upgrade lets you batch records by specific attributes, not just the primary key.

This feature can save time and boost performance if you work with multi-tenant systems, data migration, or advanced filtering.

Quick Guide: Batching with Custom Columns #

To start using custom columns for batching, specify them in the cursor option. Here’s a quick example:

Product.in_batches(cursor: [:shop_id, :id]) do |relation|
  # process each batch of products by shop_id
end

This command tells Rails to process Product records in batches using both shop_id and id as the cursor. It’s ideal for scenarios where records are grouped by specific attributes like location, tenant, or priority.

Common Use Cases #

1. Multi-Tenant Data Processing #

If you’re managing data by tenant (e.g., by shop_id), you can process each tenant’s data in its own batch, making operations cleaner and reducing potential conflicts.

Order.in_batches(cursor: [:tenant_id, :id]) do |batch|
  # Process orders per tenant
end

2. Time-Based Archiving #

Use batching by date and ID to archive older records while keeping recent ones available. This method reduces database load by archiving in chunks.

Event.in_batches(cursor: [:event_date, :id]) do |batch|
  # Archive events by date
end

3. Custom Sorting for Tasks #

Batching by custom criteria like priority and date lets you prioritize tasks while processing.

Task.in_batches(cursor: [:priority, :created_at]) do |batch|
  # Process tasks by priority and date
end

4. Inventory Management by Location #

Batch inventory updates by location and product to manage stock at specific warehouses.

Inventory.in_batches(cursor: [:warehouse_id, :product_id]) do |batch|
  # Update inventory by warehouse
end

5. Customer Segmentation for Campaigns #

Group customers by region and signup date for segmented marketing. Batching by these attributes allows more focused engagement.

Customer.in_batches(cursor: [:region, :signup_date]) do |batch|
  # Target customers by region
end

Why This Matters #

Rails’ new custom batching makes it easier to control data processing, especially for high-scale applications. Now, you can batch records based on how your data is structured, saving time and reducing complexity in your code.

Reading this because something is going wrong?

A free code audit gives you a written assessment of your codebase in plain English.

Get a Free Code Audit

Rated 4.8/5 on Clutch · you keep the write-up either way

Comments