Edited at

table_printに感動した。

More than 5 years have 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