More than 1 year has passed since last update.

https://github.com/arches/table_print
http://tableprintgem.com/

※日本語が含まれる場合は、幅調整がうまくいかない模様

モデルの関係は以下のようにしておく

[book] belongs_to [author]
[book] has_many [photos]

何も指定しない場合

$ rails c
Loading development environment (Rails 4.0.0)
[1] pry(main)> tp Book.all;
  Book Load (0.1ms)  SELECT "books".* FROM "books"
ID | NAME     | AUTHOR_ID | CREATED_AT              | UPDATED_AT             
-----------------------------------------------------------------------------
1  | 太郎の本     | 1         | 2013-08-30 09:46:46     | 2013-08-30 09:46:46    
2  | 花子の本     | 2         | 2013-08-30 09:46:46     | 2013-08-30 09:46:46    
3  | Bob Book | 3         | 2013-08-30 09:46:46     | 2013-08-30 09:46:46   

必要項目だけ指定する

tp Book.all, "name", "created_at";
NAME     | CREATED_AT             
----------------------------------
太郎の本     | 2013-08-30 09:46:46    
花子の本     | 2013-08-30 09:46:46    
Bob Book | 2013-08-30 09:46:46

belongs_toのデータを取得する

tp Book.includes(:author), "name", "author.name";
NAME     | AUTHOR.NAME
----------------------
太郎の本     | 山田太郎       
花子の本     | 鈴木花子       
Bob Book | Bob

has_manyのデータを取得する

tp Book.includes(:photos), "name", "photos.name"
NAME     | PHOTOS.NAME
----------------------
太郎の本     | 太郎の写真(A)   
         | 太郎の写真(B)   
花子の本     | 花子の写真(A)   
         | 花子の写真(B)   
         | 花子の写真(C)   
Bob Book | Bobの写真(A)

フィールドとして定義されていないものを出す場合

この場合は Bookが保有するphotoの数

以下のように フィールド名: lambda{|u| u.something}とする

tp Book.all, "name", photo_count: lambda{|u| u.photos.count}
NAME     | PHOTO_COUNT
----------------------
太郎の本     | 2          
花子の本     | 3          
Bob Book | 1

特定のフィールドの日付フォーマットを変更する

tp Book.all, :name, {created_at: {time_format: '%Y-%m-%d'}}
NAME     | CREATED_AT             
----------------------------------
太郎の本     | 2013-08-30             
花子の本     | 2013-08-30             
Bob Book | 2013-08-30

なお、通常は30文字で省略されてしまうので、特定のフィールドの表示幅を変更する場合は、
widthオプションを追加する

tp Book.all, {name: {width: 1}}, :created_at
NA... | CREATED_AT             
-------------------------------
太郎... | 2013-08-30 09:46:46    
花子... | 2013-08-30 09:46:46    
Bob Bo... | 2013-08-30 09:46:46

config

tp.setを使用し、configを設定することも可能

tp.set Book, "name", "author.name", "photos.name"

としておくことで、

tp Book.all

とすると、以下が表示されるようになる。

NAME     | AUTHOR.NAME | PHOTOS.NAME
------------------------------------
太郎の本     | 山田太郎        | 太郎の写真(A)   
         |             | 太郎の写真(B)   
花子の本     | 鈴木花子        | 花子の写真(A)   
         |             | 花子の写真(B)   
         |             | 花子の写真(C)   
Bob Book | Bob         | Bobの写真(A)

なお、以下でclearできる

tp.clear Book

AR以外でも利用可能

Classの場合

require 'table_print'
class Foo
  attr_accessor :bar, :baz
end

x = [].tap do |m|
  m << Foo.new.tap{|n| n.bar = 'bar1' ; n.baz = 'baz1' }
  m << Foo.new.tap{|n| n.bar = 'bar2' ; n.baz = 'baz2' }
end

tp x
BAR  | BAZ 
-----------
bar1 | baz1
bar2 | baz2

Hashの場合

require 'table_print'
x = [{x: 'a', y: 'b'}, {x: 'c', y: 'd'}]
tp x
X | Y
-----
a | b
c | d