我一直在嘲笑我的大脑,但无法得到它。我觉得答案很明显。
我要做的是以下内容:
我有一个索引控制器,列出了一系列可以使用Ransack搜索的作业。每个作业都有一个完成日期,其中包含日期或为空(未完成)。目前,搜索本身效果很好。我想这样做,以便索引页面加载显示只有未完成的工作,但我也希望它工作,以便当有人确实运行搜索时,返回完成和未完成工作的结果。
非常感谢任何帮助。在下面的代码中,:actual
是具有完成日期的字段的名称。我也在环顾网络,并认为我可能在Job模型中使用的DEFAULT_SEARCH_PARAMETER={}
可能有用,但我似乎无法理解。
这是代码:
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
答案 0 :(得分:31)
参加晚会,但我想我会提出另一种方法,以防其他人遇到这种情况。
上面的答案有效,但它的缺点是默认情况不会添加到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
答案 1 :(得分:19)
我认为您可以在搜索参数不存在时应用自己的过滤器:
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
答案 2 :(得分: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
答案 3 :(得分:0)
多年后,我发现自己遇到了这个确切的问题,所以我想我会加入我正在使用的解决方案。在控制器中设置默认搜索参数并将它们反向合并到 params[:q]
中:
def index
default_search_params = {
status_cont: "open"
}
@search = Job.search((params[:q] || {}).reverse_merge(default_search_params))
...
end