This Week in Rails

May 19, 2023

Rails World CFP, ActiveRecord.disconnect_all!, optimized where query and more!

Hello Everyone!

This is Vipul, bringing you this week’s changes in the Rails codebase.

Rails World Call for Papers now open

This CFP is open until June 16, with space in the agenda for 26 talks on two tracks, and up to six workshops. Read the full announcement for more details and submit your proposal!

Introduce ActiveRecord.disconnect_all! to close all connections from pool

This change introduces a multi-db aware version of ActiveRecord::Base.connection.disconnect!.
It also avoids connecting to the database if we weren’t already connected.
This can be useful to reset state in multi-db applications after establish_connection has been used.

Optimized where query for a range where begin and end are same

This fix, optimizes the where query for a range where begin and end values are the same. For example when doing User.where(id: 2..2).

# Before
SELECT `users`.* FROM `users` WHERE `users`.`id` BETWEEN 2 AND 2

# After
SELECT `users`.* FROM `users` WHERE `users`.`id`=2

Nice and effective!

Make sure curl is available in generated docker image

The dockerfile template for Apps generated by Rails now includes curl package by default. This was necessary for health-checks when docker images are used to deploy with MRSK, which uses curl.

Return INCLUDE columns in PostgreSQL indexes as strings

Support for INCLUDE columns for PostgreSQL was introduced in previously. This change makes sure that include returns strings instead of symbols, to keep behaviour same as what columns returns.

Discard connections which may be left in a transaction

Connections are discarded in within_transaction if rolling back fails after the call to yield raises. This is done to prevent a connection from being left in a transaction if the rollback actually failed.

This change causes connections to be discarded in the following additional cases where the connection may be left in a transaction:
- If beginning the transaction fails.
- If rolling back the transaction fails.
- If committing the transaction fails, then rolling back fails.
by rescuing the above failures and discarding the connection.

Enable passing column size to migration generator 

This commit enables passing a size attribute to the rails migration generator, so that it doesn’t need to be manually added to the migration file after it is generated. 

# Before
rails generate migration CreateAuthor name:text{65535}

# After
rails generate migration CreateAuthor name:text{medium}

This generates a migration which includes the size attribute:

class CreateAuthor < ActiveRecord::Migration[7.1]
  def change
    create_table :authors do |t|
      t.text :name, size: :medium

Content Security Policy: add :unsafe_hashes mapping

This change adds the corresponding mapping for unsafe_hashes, which now allows us to use :unsafe_hashes instead of 'unsafe-hashes' in CSP configuration.

Rails.application.configure do
  config.content_security_policy do |policy|
    # ...
    policy.script_src  :self, :strict_dynamic, :unsafe_hashes,
                       "'sha256-lo7ZdP6kFds+wf1WMWvn7MhcFVFJV44kAXODRevzRZ8='" # javascript:false
    # ...
  # ...

This allows us to use inline event handlers properly, which used to failwith error on wrong key unsafe-hashes that was not supported properly before

You can view the whole list of changes here.
We had 20 contributors to the Rails codebase this past week!

Until next time!

About This Week in Rails

Your weekly inside scoop of interesting commits, pull requests and more from Rails.