使用ransack进行查询:默认情况下如何获得无结果

时间:2014-06-19 15:16:32

标签: ruby-on-rails activerecord ransack

我希望我的页面默认没有结果。

我希望实现相同的效果,例如当我添加.none到结果但仍然在参数设置结果后显示。 我怎样才能做到这一点?

def index
 @search = SomeClass.all
 @items = @search.result.page(params[:page]).per(10)
end

2 个答案:

答案 0 :(得分:2)

如果我理解你的问题,你希望你的索引页面在你第一次加载视图时(当过滤器为空时)不显示任何记录。这可能导致返回太多记录,并且用户将遇到非常慢的加载页面。

解决此问题的一种方法是确保在搜索参数传递给操作时执行搜索查询

在您的控制器中

def index
 # we define the search but we don't execute it right away
 search
 # execute the search query only if search params exists
 items(params[:page],10) if search_params 
end

private

def items(page,per=10)
  @items ||= search.result(page).per(per)
end 

def search
  @search ||= SomeClass.search(search_param)
end

def search_param
  params[:q]
end

在您的视图中

现在您可以安全地引用@search,它将始终在您的视图中定义。 另一方面,可能会或可能不会定义@items,因此您必须在视图中处理这两种情况。 例如haml:

.row
  = @items.nil? ? (render 'no_results') : (render 'results')

答案 1 :(得分:0)

可能是更好的解决方案,请使用.none而不是.all

def index
  search_params = params[:q]
  query_base = search_params.present? ? Model.all : Model.none
  @search = query_base.ransack(search_params)
  @records = @search.result
end