ARSpy¶ ↑
A Rails console command line tool for exploring, browsing and inspecting the structure, associations and data of ActiveRecord data models.
Resources¶ ↑
Install
-
sudo gem install arspy
Use
-
require ‘arspy’
Description¶ ↑
ARSpy provides a number of functions for inspecting a Rails application’s ActiveRecord model. To use the gem all you need to to is the following:
sudo gem install arspy ruby script/console require 'arspy'
With ARSpy, you can view associations, fields and data related to tables and relations in an easy-to-read format.
Inspecting ActiveRecord Associations and Attributes (Fields)¶ ↑
‘Listing fields’ with the ‘lf’ command¶ ↑
Append the ‘lf’ command to an ActiveRecord object, class, or association method to print the name, type and database variable type for each attribute.
User.lf first_name :string (varchar(50)) last_name :string (varchar(50)) active :boolean (boolean) age :age (int(11))
‘Listing associations’ with the ‘la’ command¶ ↑
Append the ‘la’ command to an ActiveRecord object, class or association method to print the name, type, class and configuration information for each association.
User.la blogs has_many (Blog) comments has_many (Comment) friendships has_many (Friendship) friends has_many (User) {:through=>:friendships} assets has_many (Asset) {:as=>:asset}
Applying ‘lf’ and ‘la’ commands¶ ↑
The ‘la’ and ‘lf’ command can be used on any ActiveRecord object, class, association or array of these.
u = User.find_by_last_name('Smith') u.la u.blogs.lf u.blogs.title u.blogs.la u.blogs.comments.la u.blogs.comments.user.lf u.blogs.comments.user.pr(:first_name, :last_name) #see 'pr' command below
Printing in Columns¶ ↑
Printing arrays with the ‘pr’ command¶ ↑
Array data in the console is not so easy to read.
names ["Peter Smith", "Sarah Johnson", "Randy Wade", "Alex Parsons", "Beth Silverton", "Jenny Westmeyers", "Benjamin Grant", "Maria Stone"]
Use the ‘pr’ command to print in a column.
names.pr Peter Smith Sara Johnson ...
Print columns of object attributes with the ‘pr’ command¶ ↑
Arrays of ActiveRecord objects are even more difficult to read and analyze. Use ‘pr’ command to print attributes (fields) in columns.
User.find(2).friends.pr :first_name, :last_name Randy Wade Benjamin Grant Jenny Westmeyers Maria Stone
Printing expressions with ‘pr’ command¶ ↑
Pass an expression as one of the columns to the ‘pr’ command.
User.find(2).friends.pr '"#{last_name}, #{first_name}"', :age Wade, Randy 25 Grant, Benjamin 28 Westmeyers, Jenny 24 Stone, Maria 33
Expressions using associations
User.find(2).friends.pr :first_name, :last_name, 'comments.count', 'blogs.count' Randy Wade 23 3 Benjamin Grant 98 20 Jenny Westmeyers 213 2 Maria Stone 8 88
Printing objects and classes¶ ↑
ARSpy integrates ‘awesome print’ to print lists of objects and classes. Print objects or classes with the ‘pr’ command, or explicitly print with the ‘ap’ command.
User.ap # => prints the object attributes and columns with awesome print User.find(2).blogs.title.pr #=> prints the titles of all blogs User.find(2).blogs.pr # => prints the object fields and data usign awesome print
Iterating Associations and Data¶ ↑
Chaining associations to get data sets¶ ↑
Chain associations to get an array of the results. For example, the following will collect all of the comment objects for all blogs written by User with ID=2.
User.find(2).blogs.comments [#<Comment id: 21, user_id: 8, blog_id: 85, rating: 5, ...
Clean this up by further chainging to return an array of the ‘comment’ field of each comment object and use ‘pr’ to print in a column.
User.find(2).blogs.comments.comment.pr I agree with the blogger I'm new to ActiveRecord. Is there anyway to... How do you use polymorphic associations to... ...
Note that chaining is accumulative. To limit the results set, use the ‘wi’ or ‘wo’ commands.
Limiting data sets¶ ↑
Limiting with the ‘with’ command¶ ↑
The ‘with’ command is abbreviated to ‘wi’ in an expression. It’s like saying only show me the results with this condition OR this condition, etc.
Say we want to limit comments in the above example to only those written by Randy Wade and Maria Stone. If their user ids are [5, 9], then we can write
User.find(2).blogs.comments.wi(:user_id=>[5, 9]).comments.pr
We could use ARSpy to look up the user ids.
User.find(2).blogs.comments.user.pr :first_name, :last_name, :id
Note in this example, the ‘wi’ command is acting on attributes of the object immediately preceding it, namely, the Comment object.
ORing and ANDing with the ‘wi’ command¶ ↑
The ‘wi’ command can take an unlimited number of parameters. Multiple parameters works as an OR operation on the results. So the above example could have been written
User.find(2).blogs.comments.wi(:user_id=>5, :user_id=>9).comments.pr
with the same results.
To get an AND operation, chain the ‘wi’ command.
User.find(2).blogs.comments.wi(:blog_id=>6).wi(:user_id=>5).comments.pr
This example returns only comments for blog with ID 6 and user associated with the comment with ID 5. On the other hand,
User.find(2).blogs.comments.wi(:blog_id=>6, :user_id=>5).comments.pr
returns all comments associated with blog id 6 OR user id 5.
Parameters of the ‘wi’ command¶ ↑
The ‘wi’ command can take integers, strings and a hash of conditions.
Strings are expressions evaluated against the preceding object.
User.find(2).blogs.comments.wi('user.last_name.include?("Grant")').comment.pr
Integers are IDs for the object.
User.find(2).blogs.comments.wi(20,21,22).comment.pr
A hash of {attribute=>}. The following displays comments belonging to blogs with ids 6, 7 or 8.
User.find(2).blogs.comments.wi(:blog_id=>[6,7,8]).comments.pr
Excluding with the ‘wo’ (without) command¶ ↑
The ‘wo’ command does the exact opposite of the ‘wi’ command, showing only those results that do not meet the conditions passed in the parameters.
Dependencies¶ ↑
-
ActiveRecord
-
ActiveSupport
-
Awesome Print