在Ransack上为rails设置默认搜索参数

Ale*_*ore 13 search ruby-on-rails ruby-on-rails-3 ransack

我一直在抨击我的大脑,但无法得到它.我觉得答案可能很明显.

我想要做的是以下内容:

我有一个索引控制器,列出了一系列我可以使用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
Run Code Online (Sandbox Code Playgroud)

ric*_*ock 32

迟到了,但我想我会建议另一种方法,以防其他人遇到这种情况.

上面的答案有效,但它的缺点是默认值没有添加到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
Run Code Online (Sandbox Code Playgroud)


les*_*est 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
Run Code Online (Sandbox Code Playgroud)

  • 在遵循此答案之前,请先检查 ricsrock 的更好答案。 (3认同)
  • 谢谢!这很有效.我会投票,但我没有声誉. (2认同)