railsの勉強

作成したブックマークアプリを修正。
登録したものから順に並ぶようになっている(並べ替えていない)が、新しく登録したものが前になるように並べたい。
app/view/admin/list.rhtmlを視ると、bookmarks配列が渡されてきて、それをtableに設定している。このviewのデータはcontrollerから渡され、viewは、list.rhtmlなので、対応するcontrollerは、admin_controller::listメソッドとなる。この中は、次のようになっている。


def list
@bookmark_pages, @bookmarks = paginate :bookmarks, :per_page => 10
end
paginateというメソッドで、DBから10個ずつBookmarkオブジェクトを取得して、bookmarks配列に設定しているらしい。
paginateというメソッドを探してみると、ActionController::Paginationモジュールにあり(ApplicationController < ActionController::Baseだが、ActionController::BaseとActionController::Paginationの関係がよくわからない、BaseがPaginationをMix-inしてると思う)、このメソッドの第2引数にHashオブジェクトを渡すといろいろ動作をかえることができるらしい。上では、:per_pageキーの値に数値を渡すとその個数ずつDBをフェッチしている。Hashのキーに:orderというのが指定できるが、その値としては、SQLのorder by句を渡せばよいということで、上のメソッドを以下のように修正。

def list
@bookmark_pages, @bookmarks = paginate :bookmarks,
{:per_page => 10, :order => "col_time DESC"}
end
col_timeは、登録時間を保持する列の名前、降順なので、DESC。古いものから並べるなら、ASC。
めでたく、新しいものが上になるように並んだ。
つぎは、クリックが多いものから並べるとか、ボタンを押すとクリックが多いものから並べるというふうにしたいのだが、どうやったらできるのだろう?