如何使用searchkick进行复杂的查询?

时间:2019-09-02 17:58:44

标签: ruby-on-rails searchkick

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

该对象称为HeroPage。它具有一个称为hero_object的多态属性,可以是UserOrganization

我现在正在执行的代码:

@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_search * 4大小的per_page?这样我以后就可以进行过滤了。

1 个答案:

答案 0 :(得分:0)

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

查询示例:

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