1

我正在尝试使用轮胎/弹性搜索为我的客户端模型实现全文搜索。我有一组用户,与客户一起工作。Client 和 User 模型之间存在 HABTM 关联。

有一个manager功能只限定客户端,由特定用户管理(在大多数情况下是当前登录的用户)。我想在轮胎中实现一个搜索过滤器,它的工作方式与 ActiveRecord 的工作方式大致相同。它不适用于轮胎(抛出no filter registered for [user_ids]错误)。

s.filter :user_ids, manager(params[:manager]).map(&:id) 
  if params[:manager].present?

我相信我可能会在这里做一些完全不可行的事情,但是我这样做的方式有什么问题,你会推荐什么教程/阅读?

这是模型。

class Client < ActiveRecord::Base

  has_and_belongs_to_many :users, :uniq => true

  ## Tire would-be implementation
  # include Tire::Model::Search
  # include Tire::Model::Callbacks
  # mapping do
  #   indexes :name
  #   indexes :comment
  #   indexes :user_ids
  # end

  def self.manager(user_id)
    joins(:users).merge(User.current(user_id))
  end

  def self.index_search(params={})
    ## Tire would-be-implementation - does not work
    # tire.search(load: true) do |s|
    #   s.query { string params[:search], default_operator: "AND" } if params[:search].present?
    #   s.filter :user_ids, manager(params[:manager]).map(&:id) if params[:manager].present?
    # end

    # ActiveRecord implementation - works
    if params[:manager].present?
      if params[:search].present?
        @clients = manager(params[:manager]).where(['name LIKE ?', "%#{params[:search]}%"])
      else 
        @clients = manager(params[:manager])
      end
    else
      if params[:search].present?
        @clients = where(['name LIKE ?', "%#{params[:search]}%"])
      else 
        @clients = all
      end
    end
  end

end
4

1 回答 1

0

尝试类似的东西

t.filter :not , {:ids => { :values => self.manager(params[:manager]).map(&:id) }} if params[:manager].present?

或者

t.filter :ids, :values => self.manager(params[:manager]).map(&:id) if params[:manager].present?
于 2012-06-29T14:14:21.093 回答