如何使用 searchkick 以包含方式 (AND) 过滤结果
How to filter results inclusively (AND) with searchkick
我有两个模型:Worker
和 Skill
。
一个工人可以有多种技能。每个技能都有自己的名称(例如'php'、'web-development'等)
在我的搜索表单中,我希望能够根据工作人员的技能筛选工作人员(在 searchkick 的帮助下)。如果在表格中选择了多项技能,搜索结果应该只包括那些拥有所有所选技能的工人。
我尝试了以下方法:
worker.rb
has_many :worker_skills
has_many :skills, through: worker_skills
searchkick
scope :search_import, -> { includes(:skills) }
def search_data
{
skills_name: skills.pluck(:name)
}
end
skill.rb
has_many :worker_skills
has_many :workers, through: :worker_skills
workers_controller.rb
def index
...
@workers = Worker.search(
params[:q],
where: {
skills_name: params[:skills]
}
end
...
end
这 return 是至少拥有一项选定技能的所有工人。
示例:
Filters selected: ['php', 'ruby']
Result: All workers who either have 'php' - OR - 'ruby' as a skill.
我怎样才能只return那些同时拥有这两种技能的工人?
即'php' - 和 - 'ruby'
如果您查看此处 https://github.com/ankane/searchkick#querying,您可以使用 all
参数,以便它必须与 where 子句中的所有元素匹配。在您的 workers_controller.rb 中执行以下操作:
def index
...
@workers = Worker.search(
params[:q],
where: {
skills_name: {
all: params[:skills]
}
}
end
...
end
另外请记住确保您在 params[:skills]
中有值。如果不是,你会得到一个 undefined method `each' for nil:NilClass 错误。因此,在选择某些值之前可能会禁用搜索按钮。
我有两个模型:Worker
和 Skill
。
一个工人可以有多种技能。每个技能都有自己的名称(例如'php'、'web-development'等)
在我的搜索表单中,我希望能够根据工作人员的技能筛选工作人员(在 searchkick 的帮助下)。如果在表格中选择了多项技能,搜索结果应该只包括那些拥有所有所选技能的工人。
我尝试了以下方法:
worker.rb
has_many :worker_skills
has_many :skills, through: worker_skills
searchkick
scope :search_import, -> { includes(:skills) }
def search_data
{
skills_name: skills.pluck(:name)
}
end
skill.rb
has_many :worker_skills
has_many :workers, through: :worker_skills
workers_controller.rb
def index
...
@workers = Worker.search(
params[:q],
where: {
skills_name: params[:skills]
}
end
...
end
这 return 是至少拥有一项选定技能的所有工人。
示例:
Filters selected: ['php', 'ruby']
Result: All workers who either have 'php' - OR - 'ruby' as a skill.
我怎样才能只return那些同时拥有这两种技能的工人?
即'php' - 和 - 'ruby'
如果您查看此处 https://github.com/ankane/searchkick#querying,您可以使用 all
参数,以便它必须与 where 子句中的所有元素匹配。在您的 workers_controller.rb 中执行以下操作:
def index
...
@workers = Worker.search(
params[:q],
where: {
skills_name: {
all: params[:skills]
}
}
end
...
end
另外请记住确保您在 params[:skills]
中有值。如果不是,你会得到一个 undefined method `each' for nil:NilClass 错误。因此,在选择某些值之前可能会禁用搜索按钮。