<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title>RubyHash Blog</title><description>Articles about Ruby, Rails, testing, and developer tooling from the team behind RubyHash.</description><link>https://rubyhash.dev/</link><language>en-us</language><item><title>Why Timestamps Break Hash Equality in Ruby Tests</title><link>https://rubyhash.dev/blog/timestamps-breaking-hash-equality/</link><guid isPermaLink="true">https://rubyhash.dev/blog/timestamps-breaking-hash-equality/</guid><description>Your test asserts two hashes are equal, the timestamps look identical, but it still fails. Here is why Ruby time values break hash equality and how to fix it.</description><pubDate>Fri, 10 Jul 2026 00:00:00 GMT</pubDate></item><item><title>Symbol vs String Keys: The Hash Bug That Hides in Plain Sight</title><link>https://rubyhash.dev/blog/ruby-symbol-vs-string-keys/</link><guid isPermaLink="true">https://rubyhash.dev/blog/ruby-symbol-vs-string-keys/</guid><description>In Ruby, :name and &quot;name&quot; are different hash keys, even though they look almost the same. That one distinction is behind a whole category of nil-returning, test-failing bugs.</description><pubDate>Sat, 27 Jun 2026 00:00:00 GMT</pubDate></item><item><title>Minitest Hash Diff Hard to Read? Here&apos;s How to Actually Compare Them</title><link>https://rubyhash.dev/blog/minitest-hash-diff-hard-to-read/</link><guid isPermaLink="true">https://rubyhash.dev/blog/minitest-hash-diff-hard-to-read/</guid><description>When a Minitest assertion fails on two hashes, the output is nearly unreadable. Here&apos;s why it happens and a faster way to find the one value that changed.</description><pubDate>Sat, 27 Jun 2026 00:00:00 GMT</pubDate></item><item><title>How to Compare Two Ruby Hashes and Find the Difference</title><link>https://rubyhash.dev/blog/compare-two-ruby-hashes/</link><guid isPermaLink="true">https://rubyhash.dev/blog/compare-two-ruby-hashes/</guid><description>Several ways to compare two Ruby hashes and find exactly what changed, from plain Ruby techniques to a visual side-by-side diff, with the tradeoffs of each.</description><pubDate>Sat, 27 Jun 2026 00:00:00 GMT</pubDate></item><item><title>Rails Test Failing on a Hash Assertion? A Debugging Checklist</title><link>https://rubyhash.dev/blog/rails-test-hash-assertion-failing/</link><guid isPermaLink="true">https://rubyhash.dev/blog/rails-test-hash-assertion-failing/</guid><description>Your Rails test asserts two hashes are equal, they look identical, but the test still fails. Here&apos;s a checklist of the usual causes and how to find the real one.</description><pubDate>Sat, 27 Jun 2026 00:00:00 GMT</pubDate></item><item><title>==, eql?, equal?, ===: Ruby&apos;s Four Kinds of Equal</title><link>https://rubyhash.dev/blog/ruby-equality-methods/</link><guid isPermaLink="true">https://rubyhash.dev/blog/ruby-equality-methods/</guid><description>Ruby has four different methods for asking whether two things are equal, and they don&apos;t mean the same thing. Knowing which is which explains case statements, hash keys, and a class of subtle bugs.</description><pubDate>Tue, 16 Jun 2026 00:00:00 GMT</pubDate></item><item><title>Data.define: Ruby&apos;s Immutable Value Objects</title><link>https://rubyhash.dev/blog/ruby-data-define/</link><guid isPermaLink="true">https://rubyhash.dev/blog/ruby-data-define/</guid><description>Ruby 3.2 added Data.define, a built-in way to create small immutable value objects. It&apos;s what Struct should have been, and it replaces a surprising amount of boilerplate.</description><pubDate>Mon, 01 Jun 2026 00:00:00 GMT</pubDate></item><item><title>reduce vs each_with_object: Pick the Right Accumulator</title><link>https://rubyhash.dev/blog/ruby-reduce-vs-each-with-object/</link><guid isPermaLink="true">https://rubyhash.dev/blog/ruby-reduce-vs-each-with-object/</guid><description>Both reduce and each_with_object fold a collection into a single result, but they disagree about who owns the accumulator. Getting that wrong is the most common Enumerable bug there is.</description><pubDate>Fri, 29 May 2026 00:00:00 GMT</pubDate></item><item><title>Memoization in Ruby: ||= and Its Sharp Edges</title><link>https://rubyhash.dev/blog/ruby-memoization/</link><guid isPermaLink="true">https://rubyhash.dev/blog/ruby-memoization/</guid><description>The ||= memoization pattern is everywhere in Ruby code, and it quietly breaks on nil, false, and any method that takes arguments. Here is what actually happens and how to do it right.</description><pubDate>Tue, 19 May 2026 00:00:00 GMT</pubDate></item><item><title>Hash Defaults: The Underused Feature That Replaces Half Your Boilerplate</title><link>https://rubyhash.dev/blog/ruby-hash-defaults/</link><guid isPermaLink="true">https://rubyhash.dev/blog/ruby-hash-defaults/</guid><description>Ruby hashes can carry their own default value or default block. Used well, they replace nil checks, initialization ceremony, and a surprising amount of glue code.</description><pubDate>Fri, 01 May 2026 00:00:00 GMT</pubDate></item><item><title>Lazy Enumerators: Process Millions of Rows Without Blowing Up Memory</title><link>https://rubyhash.dev/blog/ruby-lazy-enumerators/</link><guid isPermaLink="true">https://rubyhash.dev/blog/ruby-lazy-enumerators/</guid><description>Ruby&apos;s lazy enumerators let you chain map, select, and reject on enormous datasets without loading everything into memory. Here&apos;s how they work and when to reach for them.</description><pubDate>Thu, 16 Apr 2026 00:00:00 GMT</pubDate></item><item><title>Ruby Error Handling: rescue, retry, and Custom Exceptions</title><link>https://rubyhash.dev/blog/ruby-error-handling/</link><guid isPermaLink="true">https://rubyhash.dev/blog/ruby-error-handling/</guid><description>Most Ruby error handling is either too broad or too silent. Here&apos;s how to use rescue, retry, and custom exceptions to build code that fails clearly and recovers gracefully.</description><pubDate>Wed, 08 Apr 2026 00:00:00 GMT</pubDate></item><item><title>Enumerable: The Module That Runs Ruby</title><link>https://rubyhash.dev/blog/ruby-enumerable/</link><guid isPermaLink="true">https://rubyhash.dev/blog/ruby-enumerable/</guid><description>Ruby&apos;s Enumerable module gives you 50+ methods for free. Understanding it changes how you think about collections, pipelines, and data transformation.</description><pubDate>Tue, 31 Mar 2026 00:00:00 GMT</pubDate></item><item><title>Hash#fetch vs Hash#[]: The Difference That Catches Bugs</title><link>https://rubyhash.dev/blog/ruby-hash-fetch/</link><guid isPermaLink="true">https://rubyhash.dev/blog/ruby-hash-fetch/</guid><description>Hash#[] silently returns nil for missing keys. Hash#fetch raises an error. That distinction prevents more bugs than you&apos;d expect.</description><pubDate>Sun, 15 Mar 2026 00:00:00 GMT</pubDate></item><item><title>tap, then, and yield_self: Ruby&apos;s Pipeline Methods</title><link>https://rubyhash.dev/blog/ruby-tap-then/</link><guid isPermaLink="true">https://rubyhash.dev/blog/ruby-tap-then/</guid><description>Ruby has three methods for building clean data pipelines: tap, then, and yield_self. Each does something slightly different, and knowing which to reach for makes your code more expressive.</description><pubDate>Wed, 25 Feb 2026 00:00:00 GMT</pubDate></item><item><title>Duck Typing: Ruby&apos;s Quiet Superpower</title><link>https://rubyhash.dev/blog/ruby-duck-typing/</link><guid isPermaLink="true">https://rubyhash.dev/blog/ruby-duck-typing/</guid><description>Why Ruby&apos;s &apos;if it quacks like a duck&apos; philosophy leads to more flexible, testable, and elegant code.</description><pubDate>Tue, 10 Feb 2026 00:00:00 GMT</pubDate></item><item><title>Metaprogramming: Where the Line Is</title><link>https://rubyhash.dev/blog/ruby-metaprogramming-line/</link><guid isPermaLink="true">https://rubyhash.dev/blog/ruby-metaprogramming-line/</guid><description>Ruby&apos;s metaprogramming is its most powerful and most dangerous feature. Here&apos;s how experienced teams decide when to use it and when to walk away.</description><pubDate>Sun, 18 Jan 2026 00:00:00 GMT</pubDate></item><item><title>Rails Concerns Done Right</title><link>https://rubyhash.dev/blog/rails-concerns/</link><guid isPermaLink="true">https://rubyhash.dev/blog/rails-concerns/</guid><description>Concerns are controversial in the Rails world. They shouldn&apos;t be. The problem isn&apos;t the pattern, it&apos;s how people use it. Here&apos;s how to use concerns well.</description><pubDate>Mon, 05 Jan 2026 00:00:00 GMT</pubDate></item><item><title>Readability Is a Feature: What Ruby Gets Right That Most Languages Don&apos;t</title><link>https://rubyhash.dev/blog/ruby-readability/</link><guid isPermaLink="true">https://rubyhash.dev/blog/ruby-readability/</guid><description>Ruby was designed to make programmers happy. That&apos;s not a slogan, it&apos;s a design philosophy that shaped how the language reads, and why that still matters.</description><pubDate>Thu, 11 Dec 2025 00:00:00 GMT</pubDate></item><item><title>Understanding Ruby&apos;s Method Lookup Path</title><link>https://rubyhash.dev/blog/ruby-method-lookup/</link><guid isPermaLink="true">https://rubyhash.dev/blog/ruby-method-lookup/</guid><description>When you call a method in Ruby, there&apos;s a specific chain of places Ruby looks to find it. Understanding that chain is the key to debugging &apos;wrong method called&apos; bugs.</description><pubDate>Fri, 03 Oct 2025 00:00:00 GMT</pubDate></item><item><title>Freeze Your Strings: Ruby&apos;s Most Underused Pragma</title><link>https://rubyhash.dev/blog/ruby-frozen-string-literal/</link><guid isPermaLink="true">https://rubyhash.dev/blog/ruby-frozen-string-literal/</guid><description>The frozen_string_literal pragma is one line of code that prevents mutation bugs, improves performance, and signals intent. Here&apos;s why you should be using it everywhere.</description><pubDate>Fri, 15 Aug 2025 00:00:00 GMT</pubDate></item><item><title>How Ruby&apos;s Testing Culture Changed the Way We Build Software</title><link>https://rubyhash.dev/blog/ruby-testing-culture/</link><guid isPermaLink="true">https://rubyhash.dev/blog/ruby-testing-culture/</guid><description>Ruby didn&apos;t just popularize test-driven development, it made testing feel inevitable. Here&apos;s how a community obsession became an industry standard.</description><pubDate>Sun, 01 Jun 2025 00:00:00 GMT</pubDate></item><item><title>Writing Rake Tasks That Don&apos;t Suck</title><link>https://rubyhash.dev/blog/custom-rake-tasks/</link><guid isPermaLink="true">https://rubyhash.dev/blog/custom-rake-tasks/</guid><description>Most Rake tasks are untested blobs of procedural code. Here&apos;s how to write ones that are namespaced, documented, testable, and actually maintainable.</description><pubDate>Tue, 22 Apr 2025 00:00:00 GMT</pubDate></item><item><title>Ruby&apos;s Comparable Module in 5 Minutes</title><link>https://rubyhash.dev/blog/ruby-comparable/</link><guid isPermaLink="true">https://rubyhash.dev/blog/ruby-comparable/</guid><description>Include Comparable, define one method, and get six comparison operators plus sorting for free. It&apos;s one of Ruby&apos;s best-kept secrets for custom objects.</description><pubDate>Fri, 14 Feb 2025 00:00:00 GMT</pubDate></item><item><title>The 3 ActiveRecord Queries Slowing Down Your Rails App</title><link>https://rubyhash.dev/blog/debugging-activerecord/</link><guid isPermaLink="true">https://rubyhash.dev/blog/debugging-activerecord/</guid><description>N+1 queries, unnecessary column loading, and the count/size/length trap. These three patterns silently kill Rails performance, and they&apos;re easy to fix.</description><pubDate>Mon, 18 Nov 2024 00:00:00 GMT</pubDate></item><item><title>Pattern Matching Changed How I Write Ruby</title><link>https://rubyhash.dev/blog/ruby-pattern-matching/</link><guid isPermaLink="true">https://rubyhash.dev/blog/ruby-pattern-matching/</guid><description>Ruby 3&apos;s pattern matching with case/in isn&apos;t just syntax sugar. It&apos;s a fundamentally different way to destructure data, and it&apos;s been production-ready since 3.1.</description><pubDate>Thu, 05 Sep 2024 00:00:00 GMT</pubDate></item><item><title>Struct vs OpenStruct: When to Use Which</title><link>https://rubyhash.dev/blog/ruby-struct-vs-openstruct/</link><guid isPermaLink="true">https://rubyhash.dev/blog/ruby-struct-vs-openstruct/</guid><description>Ruby gives you two ways to create simple data objects. One is fast, explicit, and production-ready. The other is convenient, flexible, and almost always the wrong choice.</description><pubDate>Thu, 20 Jun 2024 00:00:00 GMT</pubDate></item><item><title>Welcome to RubyHash</title><link>https://rubyhash.dev/blog/welcome/</link><guid isPermaLink="true">https://rubyhash.dev/blog/welcome/</guid><description>Introducing RubyHash, a tool that turns unreadable Minitest hash diffs into clean, sorted, side-by-side comparisons so you can see exactly what changed.</description><pubDate>Mon, 15 Apr 2024 00:00:00 GMT</pubDate></item></channel></rss>