319 posts on Rails.
View the blog →2025
- Debugging a Stack Overflow in Rails 7.2.1.1
- Active Record adds support for deprecating associations
- Active Job Continuations
- Understanding Queueing Theory
- Understanding Active Record Connection Pooling
- Finding the ideal threads per process with GVL tooling
- Amdahl's Law: the relationship of speedup and concurrency
- The GVL in Ruby and its impact on scaling Rails
- Understanding how Puma handles requests
- Scaling Rails Series
- Benchmarking caching in Rails with Redis vs the alternatives
2024
- Safely dropping tables and renaming columns in Rails
- Upgrade Ruby using dual boot
- Standardizing pagination, sorting and search in code
- Rails 7.2 adds SQL query counts to rendering logs
- Rails 8 introduces a basic authentication generator
- Managing templates across Neeto with neeto-templates-nano
- Rails 7.2 makes counter_cache integration safer and easier
- Automating error pages based on API responses
- How we migrated from Sidekiq to Solid Queue
- Rails 8 introduces a built-in rate limiting API
- Sharing data across React apps with globalProps
- Solid Queue & understanding UPDATE SKIP LOCKED
- Rails 7.1 allows subscribing to transaction events
2023
- Using Cloudflare as CDN for Rails applications
- Rails 7.1 adds path_params option to url_for
- Rails 7.1 optimizes the default SQLite3 configuration
- Rails 7.1 adds multi-column ordering to batch processing
- Rails 7.1 adds *_deliver callbacks to Action Mailer
- Rails 7.1 adds options to ActiveRecord::Relation#explain
- Rails 7.1 adds ActiveRecord::Base::normalizes
- Rails 7.1 logs the caller that enqueued a job
- Rails 7.1 adds ActiveJob.perform_all_later
- Rails 7.1 adds adapter option to disallow foreign keys
- Rails 7.1 allows aliased attributes in insert_all
2022
- How we upgraded from Rails 6 to Rails 7
- Three case studies of debugging redis running out of memory
- Rails 7.1 allows infinite ranges in length validators
- Rails 7.1 raises if Active Storage service is missing
- Rails 7.1 adds Action Cable connection-level callbacks
- Rails 7.1 audio_tag and video_tag accept Active Storage
- Rails 7.1 returns Active Storage attachments after save
- Handling SIGHUP error from Heroku
- Rails 7 adds only_numeric option to numericality validator
2021
- Rails 7 adds Pathname#existence
- Fixing slow Rails page loads by finding n+1 queries
- Rails 7 adds nested attributes support to delegated_type
- Rails 7 adds from option to assert_no_changes
- Rails 7 replaced byebug with ruby/debug
- Rails 7 adds weekday_options_for_select and weekday_select
- Rails 7 adds ActiveRecord::Base#previously_persisted?
- Rails 7 adds ActiveRecord::QueryMethods#in_order_of
- Rails 7 adds disable_joins for associations
- Rails 7 adds the ability to use pre-defined variants
- Rails 7 adds a setting to enumerate columns in select
- Reducing memory bloat of a Ruby on Rails application
- Rails 7 adds ComparisonValidator to ActiveRecord
- Rails 7 adds ActiveRecord::Relation#structurally_compatible?
- Rails 7 deprecates Enumerable#sum and Array#sum
- Rails 7 adds method calls for nested secrets
- Rails 7.0 adds encryption to Active Record models
- Rails 6.1 adds invert_where method
- Rails 7 adds Enumerable#sole
- Rails 6.1 adds in: option to validate numeric ranges
- Rails 7 adds build/create constructors to has_one :through
- Rails 6.1 adds delegated_type to ActiveRecord
- Rails 7 adds Enumerable#in_order_of
- Rails 7 adds ActiveRecord::Relation#excluding
- Rails 6.1 adds nulls_first and nulls_last to Arel
- Rails 7 adds sole and find_sole_by finder methods
- Rails 7 adds Enumerable#maximum
- Rails 6.1 adds support for PostgreSQL interval data type
- Rails 6.1 allows per environment Active Storage config
- Rails 6.1 adds support for belongs_to to has_many inversing
- Database-specific rake tasks for multi-database apps
- Rails 6.1 adds strict_loading to catch lazy loading
2020
- Rails 6.1 allows default_scope to be run on all queries
- Rails 6.1 adds where.associated for association presence
- Rails 6.1 raises on impossible camelcase inflections
- Rails 6.1 allows associations to be destroyed asynchronously
- Reduce asset delivery time from 30 to 3 seconds with CDN
- Rails 6.1 adds values_at attribute method for Active Record
- Skipping the test database with SKIP_TEST_DATABASE
- Rails 6.1 supports ORDER BY in batch processing
- Rails 6.1 deprecates structure:dump/load rake tasks
- Rails 6.1 adds --minimal option support
- Rails 6 adds support to persist timezones of Active Job
- Rails 6 adds including & excluding method on Enumerables
- Rails 6.1 raises on rollback with multiple databases
- Rendering a Liquid template inside a Liquid template
- Rails 6.1 deprecates exit statements in transactions
- Rails 6.1 creates abstract classes in multiple database mode
- Rails 6.1 adds annotate_rendered_view_with_filenames
- Rails 6.1 allows a default value for enum attributes
- Rails 6.1 adds support for where with a comparison operator
- Rails 6.1 tracks Active Storage variant in the database
- Rails 6 fixes after_commit callback invocation bug
- Rails 6.1 introduces class_names helper
- Rails Multiple Polymorphic Joins
2019
- Rails 6 adds rails db:prepare to migrate or setup a database
- Rails 6.1 adds *_previously_was attribute methods
- Rails 6 adds guard against DNS Rebinding attacks
- Rails 6 adds ActiveStorage::Blob#open
- Rails 6 adds ActionMailer#email_address_with_name
- Rails 6 raises ArgumentError if param contains colon
- Rails 6 introduces new code loader called Zeitwerk
- Rails 6 adds ActiveSupport::ActionableError
- Rails 6 add_foreign_key & remove_foreign_key SQLite3
- Rails 6 adds ActionDispatch::Request::Session#dig
- Marking arrays of translations safe using html suffix
- Rails 6 adds filter_attributes on ActiveRecord::Base
- ArgumentError for invalid :limit & :precision Rails 6
- Rails 6 Pass custom config to ActionCable::Server::Base
- Rails 6 adds support of symbol keys
- Rails 6 preserves status of #html_safe?
- Recyclable cache keys in Rails
- Rails 6 deprecates where.not as NOR & Rails 6.1 as NAND
- Rails 6 adds support for Optimizer Hints
- Rails 6 reports object allocations while rendering
- Rails 6 adds ActiveRecord::Relation#annotate
- Rails 6 adds hook to Active Job for retry & discard
- Rails 6 adds support for Multi Environment credentials
- Rails 6 adds before? and after? to Date and Time
- Rails 6 adds Array#extract!
- Rails 6 adds Enumerable#index_with
- Rails 6 adds private option to delegate method
- Rails 6 allows spaces in postgres table names
- Rails 6 adds if_not_exists option to create_table
- Rails 6 has added a way to change the database of the app
- Rails 6 adds parallel testing
- Rails 6 improves ActiveSupport::Notifications::Event
- Rails 6 allows configuring has_secure_password attribute
- Rails 6 allows overriding ActiveModel::Errors#full_message
- Rails 6 adds ActiveRecord::Relation#extract_associated
- Rails 6 adds implicit_order_column
- Bulk insert support in Rails 6
- Rails 6 drops support for PostgreSQL version less than 9.3
- Rails 6 requires Ruby 2.5 or newer
- Rails 6 database seed uses inline Active Job adapter
- Rails 6 adds ActiveRecord::Relation#reselect
- Rails 6 adds ActiveModel::Errors#of_kind?
- Rails 6 shows routes in expanded format
- Rails 6 adds ActiveModel::Errors#slice!
- Rails 6 adds create_or_find_by and create_or_find_by!
- Rails 6 raises ActiveModel::MissingAttributeError
- Rails 6 ActiveRecord::Base.configurations
- Rails 6 shows unpermitted params in logs in color
- Rails 6 delete_by, destroy_by ActiveRecord::Relation
- Rails 6 adds ActiveRecord::Relation#touch_all
- Rails 6 adds negative scopes on enum
- Replacing PhantomJS with headless Chrome
2018
- Rails 5 Active Record attributes API
- Passing current_user by default in Sidekiq
- Skipping devise trackable module for API calls
- Rails 5.2 DSL for configuring Content Security Policy
- Rails 5.2 stops some raw SQL, prevents SQL injections
- Use parametrized containers to deploy Rails microservices
- Upload direct to S3 with Pre-signed POST request
- Setting up a high performance Geocoder
- Speed up Docker image build process of a Rails app
- Rails 5.2 added method write_multi to cache store
- Rails 5.2 uses AES-256-GCM authenticated encryption
- Using Concurrent Ruby in a Ruby on Rails Application
- Rails 5.2 adds allow_other_host to redirect_back method
- Faster JSON generation using PostgreSQL JSON function
- Rails 5.2 fixes query caching in MySQL & PostgreSQL adapters
- How to mitigate DDoS using Rack::Attack
- Increase reliability using super_fetch of Sidekiq Pro
- Rails 5.2 sets version in Gemfile & adds .ruby-version
- Rails 5.2 Date#prev_occurring & Date#next_occurring
- Gpg decryption without pin entry pop up using GPGME
- Path based routing for Rails with HAProxy Ingress
- Rails 5.2 adds default option to attribute accessors
- Rails 5.2 specifying default value for class_attribute
- Rails 5.2 allows mailers to use custom Active Job class
- Rails 5.2 supports descending indexes for MySQL
- Rails 5.2 pass request params to Action Mailer previews
- Rails 5.2 adds bootsnap to the app to speed up boot time
2017
- Rails 5.2 fetch_values for HashWithIndifferentAccess
- Rails 5.1 stops loading all records on Model.all#inspect
- Rails adds accurate numerical validation
- Integrate SAML with many IDPs with Devise & OmniAuth
- Rails 5.2 expiry option for signed & encrypted cookies
- New Syntax for HTML Tag helpers in Rails 5.1
- Rails 5.1 enhances ActiveSupport::TimeZone.country_zones
- Rails 5.1 dropped jQuery dependency in default stack
- Rails using db:migrate & db:seed on Kubernetes
- Rails 5.1 adds delegate_missing_to
- Rails 5.1 adds support for limit in batch processing
- Rails 5.1 doesn't share thread_mattr_accessor variable
- Rails 5.1 introduced assert_changes and assert_no_changes
- Forward ActiveRecord::Relation#count to Enumerable#count
- Rails 5.1 has introduced Date#all_day helper
2016
- Rails 5 blogs and the art of story telling
- Rails 5 Create module and class level variables
- Rails 5 silences assets logs in dev mode by default
- Rails 5 disables autoloading while app in production
- Rails 5 adds more control to fine tuning SSL usage
- Rails 5 Discard some flash messages to trim storage
- Rails 5 deprecates alias_method_chain
- New framework defaults in Rails 5 to make upgrade easier
- Rails 5 Wildcard for specifying template dependencies
- Rails 5 Passing records to fresh_when and stale?
- Set model name in fixtures as metadata
- ActionController::Parameters in Rails 5
- Rails 5 solves ambiguous column issue
- Rails 5 Expression Indexes & Operator Classes support
- Attach arbitrary metadata to an Active Job in Rails 5
- Partial template name without Ruby identifier Rails 5
- Rails 5 Passing current record for custom error
- Skip mailers while generating Rails 5 app
- Errors can be indexed with nested attributes in Rails 5
- Rails 5 Conversion when deep munging params
- Specific mime types in controller tests in Rails 5
- Default response with 204 No Content in Rails 5
- Rails 5 ensures compatibility with Rack frameworks
- Rails 5 supports logging errors with tagged logging
- Rails 5 makes sql statements even more colorful
- Rails 5 adds helpers method in controllers for ease
- Rails 5 supports adding comments in migrations
- Rails 5 allows UUID as column type in create_join_table
- Rails 5 adds another base class Application Job for jobs
- Rails 5 Updating records in AR Relation
- Rails 5 prevents destructive action on production database
- Rails 5 adds finish option in find_in_batches
- Rails 5 introduces country_zones helper method
- Rails 5 provides fragment caching in Action Mailer views
- Rails 5 adds OR support in Active Record
- Rails 5 ArrayInquirer and checking array contents
- Rails 5 Renaming transactional fixtures to tests
- Rails 5 adds ignored_columns for Active Record
- Rails 5 adds a hidden field on collection radio buttons
- Rails 5 Attributes from Active Record to Active Model
- Rails 5 Configure Active Job backend adapter for jobs
- Rails 5 accepts 1 or true for acceptance validation
- Rails 5 supports bi-directional destroy dependency
- Rails 5 adds after_commit callbacks aliases
- Rails 5 Updating a record without updating timestamps
- Rails 5 Retrieving info of failed validations
- Rails 5 - What's in it for me?
- Rails 5 officially supports MariaDB
- Changes to test controllers in Rails 5
- accessed_fields to find active fields in application
- Rails 5 Warning when fetching with Active Record
- Rails 5 Sending STDOUT via environment variable
- Validate multiple contexts together in Rails 5
- Rails 5 changes protect_from_forgery execution order
- Rails 5 provides config to use UUID as primary key
- Rails 5 changed Active Job default adapter to Async
- Support for left outer join in Rails 5
- has_secure_token for unique random token in Rails 5
- Suppress save events in Rails 5
- Rails 5 improves rendering partial from cache
- Rails 5 switches from strong etags to weak etags
- Parameter filtering enhancement in Rails 5
- Rails 5 adds http_cache_forever
- Better exception responses in Rails 5 API apps
- Use file_fixture to access test files in Rails 5
- Migrations are versioned in Rails 5
- Rails 5 improves redirect_to :back method
- Rails 5 allows configuring queue name for mailers
- Rails 5 handles DateTime with better precision
- Active Support Improvements in Rails 5
- Rails 5 improves route search with advanced options
- Rails 5 makes belongs_to association required by default
- Rails 5 doesn't halt callback chain if false is returned
- Configuring bundler using bundle config
- Caching result sets and collection in Rails 5
- Caching in development environment in Rails 5
- Rails 5 wraps all rake commands using rails
- Each form gets its own CSRF token in Rails 5
- Rendering views outside of controllers in Rails 5
- Not using https might be breaking file uploads
- Test runner in Rails 5
2015
- ApplicationRecord in Rails 5
- How constant lookup and resolution works in Ruby on Rails
- Rails 5 allows setting custom HTTP Headers for assets
- Migrating Rails app from postgresql to sql server
- Using ReactJS with Rails Action Cable
- Verifying PubSub Services from Rails using Redis
- Voice based phone verification using twilio
- Gotcha with after_commit callback in Rails
- Phone verification using SMS via Twilio
2014
- Migrating existing session cookies while upgrading
- Rails Girls Pune 2014
- DRYing up Rails Views with View Carriers and Services
- Make Outbound calls to a phone using Twilio and Rails
- Tricks and Tips for using Fixtures effectively in Rails
- DeccanRubyConf 2014. Hou De!
- Flash access changes in Rails 4.1
- Issue with Delayed Job lifecycle and Postgres Errors
- RedDotRubyConf 2014
- Six Year Old Optional / Keyword Arguments bug
- How to add additional directories to test
- Configuring Log Formatting in Rails
2013
- Displaying non repeating random records
- Active Record is still magical
- Visitor pattern and double dispatch in ruby
- Preload, Eagerload, Includes and Joins
- Cookies on Rails
- Understanding instance exec in ruby
- Rex, Rexical and Rails routing
- Rails Routing -- a comprehensive look at routing
- Life of save in ActiveRecord