15

我一直在为此绞尽脑汁,但无法理解。我觉得答案可能很明显。

我想要做的是以下几点:

我有一个索引控制器,其中列出了我可以使用 Ransack 搜索的一系列作业。每个作业都有一个完成日期,其中有一个日期或为空(未完成)。目前,搜索本身效果很好。我想让它加载索引页面只显示未完成的工作,但我也希望它能够工作,以便当有人运行搜索时,返回已完成和未完成工作的结果。

任何帮助将不胜感激。在下面的代码中,:actual是带有完成日期的字段的名称。我也在网上四处寻找,并认为可能像DEFAULT_SEARCH_PARAMETER={}我在 Job 模型中拥有的东西可能会起作用,但我似乎无法做到。这是代码:

class Job < ActiveRecord::Base
  DEFAULT_SEARCH_PARAMETER ={}
  attr_accessible :items_attributes, :actual
end

def index
   @search = Job.search(params[:q] || Job::DEFAULT_SEARCH_PARAMETER)
   @search.build_condition
   @results = @search.result
   @job = @results.paginate(:per_page => 10, :page => params[:page])
end
4

4 回答 4

35

聚会迟到了,但我想我会建议一种替代方法,以防其他人遇到这种情况。

上面的答案有效,但它的缺点是默认选项没有添加到 Ransack 的搜索对象中,所以 - 如果您使用的是搜索表单 - 默认选择不会显示在表单中。

以下方法将默认值添加到搜索对象,因此将出现在您的搜索表单中。

def index
  @search = Job.search(params[:q])
  @search.status_cont = 'Open' unless params[:q] #or whatever, must use Ransack's predicates here
  @results = @search.result
  @job = @results.paginate(:per_page => 10, :page => params[:page])
end
于 2013-11-18T17:15:43.927 回答
20

我认为您可以在搜索参数不存在时应用自己的过滤器:

def index
  @search = Job.search(params[:q])
  @results = @search.result
  @results = @results.where(:your_date => nil) unless params[:q]
  @job = @results.paginate(:per_page => 10, :page => params[:page])
end
于 2012-11-08T19:14:16.913 回答
1

许多年后,我发现自己遇到了这个确切的问题,所以我想我会加入我正在使用的解决方案。在控制器中设置默认搜索参数并将它们反向合并为params[:q]

def index
  default_search_params = {
    status_cont: "open"
  }

  @search = Job.search((params[:q] || {}).reverse_merge(default_search_params))
  ...
end
于 2021-06-25T00:42:20.023 回答
0

因此,默认情况下,您希望页面加载实际为零的记录。稍后当用户搜索时,您想回到以前的搜索方式。

试试这个。

def index
   @search = Job.search(params[:q] || Job::DEFAULT_SEARCH_PARAMETER)
   @search.build_condition
   @results = @search.result
   if @results.nil?
        @results=Job.find(:all, :conditions => ["actual = NULL"] )
   end

   @job = @results.paginate(:per_page => 10, :page => params[:page])
end    
于 2012-11-08T18:57:00.913 回答