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