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
loaded.

So this implementation makes it clear that you've got a `Relation`, but
also shows your records.
This commit is contained in:
Jon Leighton 2012-07-06 10:39:46 +01:00
parent 8ce61a3664
commit 07314e64fd
3 changed files with 17 additions and 6 deletions

View File

@ -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.
Example:

View File

@ -514,6 +514,10 @@ module ActiveRecord
@values.dup
end
def inspect
"#<#{self.class.name} #{to_a.inspect}>"
end
private
def references_eager_loaded_tables?

View File

@ -1311,4 +1311,9 @@ class RelationTest < ActiveRecord::TestCase
relation.merge! where: 'foo'
end
end
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
end