will_paginate gem会在nil搜索时抛出异常

时间:2013-01-30 20:25:00

标签: sql ruby-on-rails-3 lazy-loading will-paginate rails-activerecord

如果结果恰好为零,我在尝试处理搜索结果时会看到来自will_paginate gem的异常。

以下是代码:

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

因此,添加一个if语句以确保在nil上永远不会调用paginate是很容易的:

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

但是,想象一下我的Post.search(查询)会返回500,000个帖子。

Will_paginate足够聪明来追加LIMIT,以惰性方式的SQL查询,从而使数据库从来没有咳出所有500000(仅在这种情况下,8个每页在时间)。

我担心的是Post.search(query).nil?没有应用此LIMIT,因此它可能会返回所有500,000个帖子,只是为了确定查询是否为零!这看起来很疯狂。

除了对查询整个500,000个结果的担忧之外,我在这里做的另一个缺点是它涉及两个单独的Post.search请求。

有没有更优雅的方法来确保我可以避免这些paginate was called on nill错误,而不会超出我需要的数据库?

1 个答案:

答案 0 :(得分:1)

您可以尝试使用方法.try代替if !Post.search(query).nil?

您的代码应如下所示:

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

PS。 if Post.search(query)也足够了。