如何持久搜索搜索参数

时间:2013-08-01 14:39:34

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

我正在使用ransack根据用户的公司和活动/非活动参数进行搜索。单独使用时效果很好,但我想同时使用它们。例如,如果我先选择公司然后选择活动/非活动用户,那么公司名称应该保持不变。

第二,当我向用户点击或再次点击用户时,是否有搜索工具可以保持这两个值的持续存在?

更新:

这是我的观点:

= search_form_for @search, url: search_users_path, method: :post, html: { class: 'sort' } do |f|
  = f.label 'company:'
  = f.select :company_id_eq,
  Company.where('is_inactive = false').collect {|c| [ c.name, c.id ] },
  {:include_blank => 'All company users'}, :'data-remote' => true, class: 'searchSelect searchUserSelect'

  %div.sort_users
    = f.label 'sort Users:'
    = f.select :deleted_eq,
    [raw("<option value= 0 selected=#{session[:deleted]}>Active Users</option><option value= 1>Inactive Users</option>")],
    {}, :'data-remote' => true, class: 'searchSelect searchUserSelect', style: "width: 205px;"

这是我在控制器中的代码

@search = User.search(params[:q])
@users = @search.result.includes(:company).order("companies.name, last_name").page(params[:page]).per(20)

1 个答案:

答案 0 :(得分:3)

关于过滤器持久性,我在before_action中使用以下ApplicationController

def get_query(cookie_key)
  cookies.delete(cookie_key) if params[:clear]
  cookies[cookie_key] = params[:q].to_json if params[:q]
  @query = params[:q].presence || JSON.load(cookies[cookie_key])
end

然后,对于Intervention模型,我有以下内容:

class InterventionsController < ApplicationController
  before_action only: [:index] do
    get_query('query_interventions')
  end

  def index
    @q = Intervention.search(@query)
    @interventions = @q.result
  end
end

这样,如果在没有interventions_path参数的情况下调用q,则会检查cookies['query_interventions']以访问上次持久查询。但是当使用interventions_path参数调用q时,会使用此新查询并将其保留以供日后使用。

此外,如果使用interventions_path参数调用clear,则会删除Cookie。

注意如果存储的值超过4k,则会引发CookieOverflow异常,但这是1024 and 4096 UTF-8 characters之间的通常可以。如果没有,您应该使用其他类型的会话存储。