如果结果恰好为零,我在尝试处理搜索结果时会看到来自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
错误,而不会超出我需要的数据库?
答案 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)
也足够了。