1

クライアントモデルの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
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 に答える