When working with Rails migrations, performance isn’t usually the first thing that comes to mind—until your schema starts getting big or you’re deploying changes to production environments with large databases. Fortunately, Rails provides a simple way to optimize schema changes: the bulk: true option.
What is bulk: true in Rails Migrations?
Introduced in Rails 5.2, the bulk: true flag can be passed to methods like change_table or create_table to group multiple schema changes into a single SQL statement, when supported by your database.
This approach reduces the number of separate ALTER TABLE calls, which not only improves performance but can also prevent potential locking or downtime issues in large tables.
Without bulk: true
1
2
3
4
5
6
7
8
class AddFieldsToUsers < ActiveRecord::Migration[7.0]
def change
change_table :users do |t|
t.string :nickname
t.boolean :admin, default: false
end
end
end
In this example, Rails will execute two separate ALTER TABLE statements—one for nickname and another for admin.
With bulk: true
1
2
3
4
5
6
7
8
class AddFieldsToUsers < ActiveRecord::Migration[7.0]
def change
change_table :users, bulk: true do |t|
t.string :nickname
t.boolean :admin, default: false
end
end
end
Here, Rails will combine both column additions into a single ALTER TABLE statement, reducing overhead and speeding up the migration.
Things to Keep in Mind
- Database compatibility: Not all databases handle bulk operations equally. PostgreSQL supports them well; MySQL may have limitations depending on the operation.
- Not all changes can be batched: Operations like adding indexes or complex constraints may still require separate SQL statements and won’t benefit from
bulk: true. - Unrelated to bulk insert/update: This
bulk: trueoption is only for schema migrations, not for mass data operations likeinsert_allorupsert_all.
When Should You Use bulk: true?
You should use bulk: true whenever you’re adding multiple columns to the same table in a single migration. It’s a small change in code that can lead to faster, safer migrations and cleaner schema logs—especially helpful in large applications or continuous deployment environments.
Using bulk: true is a subtle yet powerful optimization that many developers overlook. It doesn’t add complexity to your migration, but it can significantly reduce downtime and improve deploy times.