0

will_paginate結果が nil の場合、検索結果を処理しようとすると、gem から例外が発生します。

コードは次のとおりです。

@posts = Post.search(query).paginate(:page => params[:page], :per_page => 8)

そのため、if ステートメントを追加して、paginate が nil で呼び出されないようにするのは簡単です。

if !Post.search(query).nil?
    @posts = Post.search(query).paginate(:page => params[:page], :per_page => 8)
end

しかし、私の Post.search(query) が 500,000 件の投稿を返すと想像してください。

Will_paginate はLIMIT、SQL クエリに a を怠惰な方法で追加するほどスマートなので、データベースが 500,000 をすべて消費する必要はありません (この場合、一度に 1 ページあたり 8 つだけです)。

私の懸念は、Post.search(query).nil?この LIMIT が適用されていないため、クエリが nil であるかどうかを判断するためだけに、500,000 件の投稿すべてを返す可能性があることです! それはクレイジーに思えます。

500,000 件の結果全体を照会するという懸念以外に、ここで行っている方法のもう 1 つの欠点は、2 つの別個のPost.search要求が必要になることです。

paginate was called on nill必要以上にデータベースにアクセスすることなく、これらのエラーを回避できるようにするためのより適切な方法はありますか?

4

1 に答える 1

1

.try代わりにメソッドを使用することができますif !Post.search(query).nil?

コードは次のようになります。

@posts = Post.search(query).try(:paginate, {:page => params[:page], :per_page => 8})

PS。if Post.search(query)も十分でしょう。

于 2013-01-30T20:38:22.497 に答える