table_printに感動した。

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の場合

```rb
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の場合

```rb
require 'table_print'
x = [{x: 'a', y: 'b'}, {x: 'c', y: 'd'}]
tp x
```

```
X | Y
-----
a | b
c | d
```