40歳からのキャリアチェンジ

20代はエンジニア・PM、30代はWeb系エンジニア向けのキャリアアドバイザー。40代の今はフリーランスで開発含めて色々やってます。技術ネタとしてはRuby/RailsとJavaScript関連あたり

034-Mongoidの機能を活用してページング処理実装

ブログを閲覧するアプリに欠かせないページング処理(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かと思いサーバ側は比較的なんとかなりそうな感じです