0

will_paginate如果结果恰好为零,则在尝试处理搜索结果时,我会看到 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一种惰性的方式将 a 附加到 SQL 查询中,这样数据库就不必咳出所有 500,000 个(在这种情况下,每次每页只有 8 个)。

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

除了对查询全部 500,000 个结果的担忧之外,我在这里这样做的另一个缺点是它涉及两个单独的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 回答