Friday, May 19, 2023

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

Posted by vipulnsward

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 https://github.com/rails/rails/pull/44803. 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
    end
  end
end

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
    # ...
  end
  # ...
end

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!

Subscribe to get these updates mailed to you.