首页 > 解决方案 > 如何使用 searchkick 进行复杂查询?

问题描述

我需要进行访问关联的查询以检查 current_user 是否能够进行该搜索。我不知道如何直接从 searchkick 查询中执行此操作,因此我进行搜索,然后遍历所有项目并删除 current_user 无法访问的项目,但这并不高效。此外,此搜索是分页的。

该对象称为HeroPage。它有一个称为 的多态属性hero_object,可以是 aUser或 a Organization

我现在正在做的代码:

@hero_pages_search = HeroPage.search params[:q], fields: [ :name, :first_name, :last_name ], match: :word_start

在此之后,我遍历所有对象以检查 current_user 是否能够访问它:

@hero_pages = []
@hero_pages_search.each do |hp|
  @hero_pages.push(hp) if (hp.hero_object_type == 'User' && can_add_user(hp))
  @hero_pages.push(hp) if (hp.hero_object_type == 'Organization' && can_add_org(hp))
end

我认为can_add_usercan_add_org没有那么重要,但这是其中之一:

def can_add_user(hp)
  user = hp.hero_object
  (user.who_can_find_and_fan == 'anyone_find_fan') || user.my_network_user_ids.include?(current_user.id)
end

我怎样才能更有效地做到这一点?由于我需要对其进行分页,因此我不知道如何正确执行此操作。我可以只使用 SearchKick 查询来完成所有这些吗?也许得到@hero_pages_searchper_page* 4这样的尺寸?所以我可以稍后在迭代时进行过滤。

标签: ruby-on-railssearchkick

解决方案


一种方法是在 HeroPage 索引上索引授权或未经授权的用户 ID 和/或组织 ID,并按这些字段进行过滤。

示例查询:

HeroPage.search(
 params[:q],
 fields: [ :name, :first_name, :last_name ],
 match: :word_start,
 where: { authorized_user_ids: user_id }
)

推荐阅读