我需要进行访问关联查询,以检查current_user是否能够执行该搜索。我不知道如何直接通过searchkick查询来执行此操作,因此我进行了搜索,然后遍历所有项并删除了current_user无法访问的项,但这效率不高。同样,此搜索是分页的。
该对象称为HeroPage
。它具有一个称为hero_object
的多态属性,可以是User
或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_user
和can_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
?这样我以后就可以进行过滤了。
答案 0 :(得分:0)
一种方法是在HeroPage索引上索引授权或未授权的用户ID和/或组织ID,并按这些字段进行过滤。
查询示例:
HeroPage.search(
params[:q],
fields: [ :name, :first_name, :last_name ],
match: :word_start,
where: { authorized_user_ids: user_id }
)