我正在尝试使用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
答案 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?