1

私は、クライアントモデル用のtire/elasticsearchで全文検索を実装しようとしています。私はクライアントと協力して、一連のユーザーを持っています。クライアントモデルとユーザーモデルの間にHABTMの関連付けがあります。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 

答えて

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? 
のようなものを試してみてください