HABTM相关模型的轮胎/弹性搜索

时间:2012-02-23 14:34:06

标签: ruby-on-rails ruby-on-rails-3 activerecord elasticsearch tire

我正在尝试使用tire / elasticsearch为我的客户端模型实现全文搜索。我有一组用户,与客户合作。客户端和用户模型之间存在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

1 个答案:

答案 0 :(得分: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?
相关问题