Skip to content
Browse files

Show the records in Relation#inspect

The reason for removing the previous implementation of `#inspect` was
that it hid from you that you were dealing with a `Relation` rather than
an `Array`.

But it is still useful to be able to see the records, particularly if you're
writing something like the following in tests:

    assert_equal [foo], Post.where(:bar)

If the assertion fails, you want to see what records were actually

So this implementation makes it clear that you've got a `Relation`, but
also shows your records.
  • Loading branch information...
1 parent 8ce61a3 commit 07314e64fd62fb8e6165c8c539420160da9437e9 @jonleighton jonleighton committed
14 activerecord/
@@ -20,14 +20,16 @@
*Aleksey Magusev*
-* `ActiveRelation#inspect` no longer calls `#to_a`. This means that in places
- where `#inspect` is implied (such as in the console), creating a relation
- will not execute it anymore, you'll have to call `#to_a` when necessary:
+* `ActiveRecord::Relation#inspect` now makes it clear that you are
+ dealing with a `Relation` object rather than an array:.
- User.where(:age => 30) # => returns the relation
- User.where(:age => 30).to_a # => executes the query and returns the loaded objects, as before
+ User.where(:age => 30).inspect
+ # => <ActiveRecord::Relation [#<User ...>, #<User ...>]>
- *Brian Cardarella*
+ User.where(:age => 30).to_a.inspect
+ # => [#<User ...>, #<User ...>]
+ *Brian Cardarella & Jon Leighton*
* Add `collation` and `ctype` support to PostgreSQL. These are available for PostgreSQL 8.4 or later.
4 activerecord/lib/active_record/relation.rb
@@ -514,6 +514,10 @@ def values
+ def inspect
+ "#<#{} #{to_a.inspect}>"
+ end
def references_eager_loaded_tables?
5 activerecord/test/cases/relations_test.rb
@@ -1311,4 +1311,9 @@ def test_presence
relation.merge! where: 'foo'
+ test "relations show the records in #inspect" do
+ relation = Post.limit(2)
+ assert_equal "#<ActiveRecord::Relation [#{Post.limit(2).map(&:inspect).join(', ')}]>", relation.inspect
+ end

4 comments on commit 07314e6


Actually, an other reason for removing inspect was that with a lot of records, it can freeze the console, or write a huge log.
This has apparently been a problem for some.

Ruby on Rails member

Agreed with @dmathieu. Maybe we can add a limit(11), then we show the first 10 and add ... in case 11 items were returned?

Ruby on Rails member

I like @josevalim's proposal. @dmathieu do you want to write a patch?


Ok, I'll look into it this evening.

Please sign in to comment.
Something went wrong with that request. Please try again.