This Week in Rails

February 11, 2022

Rails 7.0.2, schema versioning based on the Rails version, and more

Hi, this is Petrik, bringing you the latest news from the Rails world.

Rails 7.0.2 has been released
While this looks like a regular patch release there are a few notable changes.
First, one feature that was introduced in 7.0.0 was removed: the ability to pass a service_name param to DirectUploadsController. This feature was causing significant issues when upgrading from Rails 6.1, so the Rails team decided to remove it while they work on a backward compatible change. They don’t take this decision lightly, and usually don’t remove features after they are released without a proper deprecation cycle, but at this time they decided to prioritize making it easier for people to upgrade.

Finally, with the same goal in mind, Rails 7.0.2 introduced a new feature, the ability to version the database schema based on the Rails version. This new feature will allow existing applications to still load their database schemas generated in Rails 6.1, with the same behavior as before, keeping it matching the production database schema.

Fiber-save ConnectionPool
When ActiveSupport::IsolatedExecutionState.isolation_level is set to :fiber, the connection pool now supports multiple Fibers from the same Thread checking out connections from the pool.

Make #to_fs the default replacement for #to_s(:format)
#to_s(:format) was recently deprecated in favor of #to_formatted_s, as Ruby 3.1. has optimized interpolation. #to_formatted_s is a pretty long name for a frequently used method. This change makes #to_fs the default in Rails internals and the documentation. #to_formatted_s is still an alias to #to_fs.

Default the ActiveSupport::MessageEncryptor serializer to JSON
Using JSON offers a more secure alternative to the current Marshal serializer.
Existing apps are provided with an upgrade path to migrate to JSON as described in the upgrading guides.

Dump the precision for datetime columns following the new defaults
Since Rails 7.0 the datetime column precision is 6 by default. That means that t.datetime calls without setting the :precision option would have its precision set to 6. This affected PostgreSQL and SQLite3. Now the dumper will generate the precision as 0 for columns without precision and omit it when the precision is 6.

Add job_id and exception message to ActiveJob retry/discard logging
In log messages for performed jobs, the Job ID and exception message were already included. But log messages related to retry/discard behavior from ActiveJob::Exceptions did not include the Job ID or exception message. We now include them, in a consistent format with other existing messages.

Reverse the order of INSERT statements in structure.sql dumps
This should decrease the likelihood of merge conflicts. New migrations will now be added at the top of the list.
For existing apps, there will be a large diff the next time structure.sql is generated.

Since last time, 25 people contributed to Rails. As usual, there's too much changes to cover them but you can check out all of these here. Until next time!