This blog is part of our Rails 5.1 series.
Let's take a project with hundreds of users. When we call inspect on User.all, we see an array of 10 users followed by .... That means the output of #inspect method shows data only for 10 records.
1> User.all.inspect 2User Load (3.7ms) SELECT "users".* FROM "users" 3=> "#<ActiveRecord::Relation [ 4#<User id: 1, email: \"[email protected]\" >, 5#<User id: 2, email: \"[email protected]\">, 6#<User id: 3, email: \"[email protected]\">, 7#<User id: 4, email: \"[email protected]\">, 8#<User id: 5, email: \"[email protected]\">, 9#<User id: 6, email: \"[email protected]\">, 10#<User id: 7, email: \"[email protected]\">, 11#<User id: 8, email: \"[email protected]\">, 12#<User id: 9, email: \"[email protected]\">, 13#<User id: 10, email:\"[email protected]\">, 14...]>"
We can see that the query executed in the process is fetching all the records even though the output doesn't need all of them.
In Rails 5.1, only the needed records are loaded when inspect is called on ActiveRecord::Relation.
1> User.all.inspect 2User Load (3.7ms) SELECT "users".* FROM "users" LIMIT $1 /*application:Ace Invoice*/ [["LIMIT", 11]] 3 4=> "#<ActiveRecord::Relation [ 5#<User id: 1, email: \"[email protected]\" >, 6#<User id: 2, email: \"[email protected]\">, 7#<User id: 3, email: \"[email protected]\">, 8#<User id: 4, email: \"[email protected]\">, 9#<User id: 5, email: \"[email protected]\">, 10#<User id: 6, email: \"[email protected]\">, 11#<User id: 7, email: \"[email protected]\">, 12#<User id: 8, email: \"[email protected]\">, 13#<User id: 9, email: \"[email protected]\">, 14#<User id: 10, email:\"[email protected]\">, 15...]>"
We can see in the above case that query executed has limit constraint and hence only the required number of records are loaded.