【问题标题】:Filtering multiple columns with Pg_Search in Ruby on Rails在 Ruby on Rails 中使用 Pg_Search 过滤多个列
【发布时间】:2020-12-01 16:23:15
【问题描述】:

我正在开展一个项目,我们必须根据地点、日期、运动和技能水平过滤事件。目前每个过滤器都单独工作,但我无法将它们链接起来以获得更具体的结果。

这就是我的模型中的内容。

 include PgSearch::Model
  pg_search_scope :global_search, 
  against: [:location, :sport, :level, :date]

  pg_search_scope :date_search,
  against: [:date]

  pg_search_scope :sport_search,
  against: [:sport],
  using: {
    tsearch: { prefix: true }
  }

  pg_search_scope :location_search,
  against: [:location],
  using: {
    tsearch: { prefix: true }
  }

  pg_search_scope :level_search,
  against: [:level]

  enum level: { Beginner: 1, Intermediate: 2, Advanced: 3, Pro: 4 }

这是在我的控制器中。

 def index
    if params[:search][:location].present?
      @events = policy_scope(Event).location_search(params[:search][:location])
    elsif params[:search][:sport].present?
      @events = policy_scope(Event).sport_search(params[:search][:sport])
    elsif params[:search][:date].present?
      @events = policy_scope(Event).date_search(params[:search][:date])
    elsif params[:search][:level].present?
      @events = policy_scope(Event).level_search(params[:search][:level])
     
    else
      @events = policy_scope(Event)
    end
  
    @markers = @events.geocoded.map do |event|
      {
        lat: event.latitude,
        lng: event.longitude
      }
    end
  end

这些是我的过滤器

 <div id="collapseFilters" class="container collapse form">
    <%= simple_form_for :search, url: events_path, method: "GET", html: { class: 'form-block' } do |f| %>
      <%= f.input :date, as: :string, required: false, input_html: {class: "datepicker"} %>
      <%= f.input :level, collection: Event.levels.map{ |l| [l.first, l.second] }, required: false, label_method: :first, value_method: :second%>
      <%= f.input :location, required: false, placeholder: 'Enter a location for your event' %>
      <%= f.button :submit, 'Search', class: "btn btn-primary btn-lg btn-form mt-3" %>
    <% end %>
    </div>

如何将它们链接到参数中,以便一次使用多个过滤器?

【问题讨论】:

    标签: ruby-on-rails ruby filter


    【解决方案1】:

    你可以更新你的控制器:

    def index
      @events = policy_scope(Event)
    
      @events = @events.location_search(params[:search][:location]) if params[:search][:location].present?  
      @events = @events.sport_search(params[:search][:sport]) if params[:search][:sport].present?
      @events = @events.date_search(params[:search][:date]) if params[:search][:date].present?
      @events = @events.level_search(params[:search][:level]) if params[:search][:level].present?
    
      @markers # ...
    end
    

    甚至(如果对你来说足够清楚的话)

    def index
      @events = policy_scope(Event)
    
      %i[location sport date level].each do |filter|
        next unless params[:search][filter].present?
    
        @events = @events.public_send("#{filter}_search", params[:search][filter])
      end
    
      @markers # ...
    end
    

    如果我知道这颗宝石的工作原理。

    【讨论】:

    • 大家好,我是 pg_search 的作者。是的,应该可以。
    【解决方案2】:

    您应该使用文档https://github.com/Casecommons/pg_search中描述的多搜索选项

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-04-20
      • 2015-04-09
      • 1970-01-01
      • 2015-05-30
      • 1970-01-01
      • 2011-04-19
      • 2014-12-15
      相关资源
      最近更新 更多