will_paginate or paginating_find

has_manyのwill_paginateでちょっとイケてないSQLが吐かれるというのはいろんなブログで書かれています。具体的には、ページ内で表示するのが10件だとしても、一度全件持ってくるSQLを発行します。そこで、別のpaginate pluginである、paginating_findを試してみました。

結果的には paginating_find だと、無駄なSQLが吐かれません。(count(*)は無駄だと思うが・・) でも、、railsのコード的には will_paginate の方が好きなんだよな。。

両方のサンプルと吐かれるSQLを下記しておきます。

ここでのサンプルは、ユーザが書いたコメントを表示するページです。
コメントは他のユーザにも表示するため、ユーザとコメントの関係は 多対多 です。

will_paginateのcontroller

@user = User.find(params[:id])
@comments = @user.comments.paginate(:page=>params[:page],:per_page=>10)

paginating_findのcontroller

@user = User.find(params[:id])
@comments = @user.comments.find(:all,:page=>{:size=>10,:current=>params[:page]})

will_paginateが吐くSQL

SELECT * FROM comments INNER JOIN comments_users ON comments.id = comments_users.comment_id WHERE (comments_users.user_id = '123' )
SELECT count(*) AS count_all FROM comments INNER JOIN comments_users ON comments.id = comments_users.comment_id WHERE (( comments_users.user_id = '123' ) AND ( comments_users.user_id = '123' ))
SELECT * FROM comments INNER JOIN comments_users ON comments.id = comments_users.comment_id WHERE (comments_users.user_id = '123' ) LIMIT 0, 10

paginating_findが吐くSQL

SELECT count(comments.id) AS count_comments_id FROM comments INNER JOIN comments_users ON comments.id = comments_users.comment_id WHERE (comments_users.user_id = '123' )
SELECT * FROM comments INNER JOIN comments_users ON comments.id = comments_users.comment_id WHERE (comments_users.user_id = '123' ) LIMIT 0, 10

@paginating_find
@will_paginate
[PR]

by etrojan2006 | 2007-09-04 11:36 | Ruby  

Apache mod_prox... >>