ブログを閲覧するアプリに欠かせないページング処理(paginate/pagination)について調べて、実装をしているのですが、思ったように作れないこともあってしばらくブログ更新滞ってしまいました。
ページング考える上で、サーバ側、クライアント側のiPhone双方から情報の受け渡しをしやすい形にする必要があるなーと気づきました。
Sinatra+MongoDBという構成にしているのですが、MongoidというMongoDB用のORMを使っています。
Mongoidのドキュメントを読むとpaginateという記述があって標準で利用出来るようなのでまずは単純にMongoDBに接続して、1ページ5件分の情報を取得するコードを書いてみました。
require 'rubygems' require 'mongoid' require 'json' Mongoid.configure do |config| name = "test" host = "localhost" config.master = Mongo::Connection.new.db(name) config.slaves = [ Mongo::Connection.new(host, 27017, :slave_ok => true).db(name) ] config.persist_in_safe_mode = false end class Entry include Mongoid::Document field :blogger field :permalink field :title field :html_body end blogger_list = ['hibi'] blogger_list.each do |blogger| items = Entry.find(:conditions => {:blogger => blogger}).paginate(:page => 1, :per_page => 5) items.each_with_index do |item,i| puts '{"' + i.to_s + '":' + item.title + '}' end end
hibiさんというブロガーの記事は数十件MongoDB上に格納してあるため、page => 2とかpage => 3としても意図したように表示されました。
あとは、クライアント側からの引数を受け取り、それを page => n に代入するような処理をSinatra上で実装すればOKかと思いサーバ側は比較的なんとかなりそうな感じです