結局 Kaminari のようなものを実装してしまいました…
例えば全部で35ページあって15ページ目だったときは、 端と真ん中の配列をまず作ってからリンクを貼る対象をまとめておきます。
#code(ruby){{ 1.9.3-p125 :004 > a1 = (1..3).map{|i| i}
=> [1, 2, 3]
1.9.3-p125 :005 > a2 = (11..19).map{|i| i}
=> [11, 12, 13, 14, 15, 16, 17, 18, 19]
1.9.3-p125 :006 > a3 = (32..35).map{|i| i}
=> [32, 33, 34, 35]
1.9.3-p125 :019 > a = (a1 + a2 + a3).sort.uniq
=> [1, 2, 3, 11, 12, 13, 14, 15, 16, 17, 18, 19, 32, 33, 34, 35]
}}
それをこんな感じで2つずつのペアにして、
#code(ruby){{ 1.9.3-p125 :021 > a.each_cons(2) {|v| p v} [1, 2] [2, 3] [3, 11] [11, 12] [12, 13] [13, 14] [14, 15] [15, 16] [16, 17] [17, 18] [18, 19] [19, 32] [32, 33] [33, 34] [34, 35]
=> nil
}}
1つ違いじゃなかったら "..." を挿入とか。 終わりの処理が美しくないですが…
#code(ruby){{ 1.9.3-p125 :030 > a.each_cons(2) {|v| 1.9.3-p125 :031 > puts v[0] 1.9.3-p125 :032?> if v[0] != v[1] - 1 1.9.3-p125 :033?> puts "..." 1.9.3-p125 :034?> end 1.9.3-p125 :035?> if v[1] == 35 1.9.3-p125 :036?> puts v[1] 1.9.3-p125 :037?> end 1.9.3-p125 :038?> } 1 2 3 ... 11 12 13 14 15 16 17 18 19 ... 32 33 34 35
=> nil
}}
他にも1ページしかなかった場合はどうするのとか、最初の range で設定するところが 端をはみ出したときの処理とか、細々とややこしいことがたくさんありますね。
あとは画面にどう出すかというのもいろいろとあるわけで、 共通化して他の処理でも使えるような部品にするにはどうするか、と。
結局一日中掛かりっきりでした。 どうもまだ美しくないような気がして、もっときれいに書けるのではとは思うんですが、 頭が痛くなってきたのでまぁ動けばいいやと。若くないなぁ。