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

问题描述 投票:0回答:1

我需要进行访问关联查询,以检查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的大小像per_page * 4?这样一来,我以后就可以进行过滤。

ruby-on-rails searchkick
1个回答
0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.