【问题标题】:Setting default search parameter on Ransack for rails在 Ransack 上为 Rails 设置默认搜索参数
【发布时间】:2012-10-28 08:41:25
【问题描述】:

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

我想要做的是:

我有一个索引控制器,其中列出了我可以使用 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

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 search ransack


    【解决方案1】:

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

    上面的答案有效,但它的缺点是默认没有添加到 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
    

    【讨论】:

    • 嘿@ricsrock 有关如何使用白名单范围执行此操作的任何想法?
    • 不错的答案@ricsrock。由于修改了 Ransack 搜索,因此很容易让您添加的默认值正确显示在呈现页面的搜索部分。
    • 非常好!它完美地工作,在搜索表单中也有各自的默认值(正如 Steven 已经指出的那样)。
    • 第二次看到你的答案。还是很棒的。这应该是正确的答案! @alexander-moore,请将此答案标记为正确答案!
    【解决方案2】:

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

    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
    

    【讨论】:

    • 谢谢!这行得通。我会投票赞成,但我没有声誉。
    • 在关注这个之前,请查看 ricsrock 的更好答案。
    【解决方案3】:

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

    def index
      default_search_params = {
        status_cont: "open"
      }
    
      @search = Job.search((params[:q] || {}).reverse_merge(default_search_params))
      ...
    end
    

    【讨论】:

      【解决方案4】:

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

      试试这个。

      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    
      

      【讨论】:

      • 我试了一下,但没有成功。不过感谢您的帮助!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-13
      • 1970-01-01
      • 2014-10-14
      相关资源
      最近更新 更多