ruby-on-rails - 如何使用 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_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
像per_page
* 4这样的尺寸?所以我可以稍后在迭代时进行过滤。
解决方案
一种方法是在 HeroPage 索引上索引授权或未经授权的用户 ID 和/或组织 ID,并按这些字段进行过滤。
示例查询:
HeroPage.search(
params[:q],
fields: [ :name, :first_name, :last_name ],
match: :word_start,
where: { authorized_user_ids: user_id }
)
推荐阅读
- linux - 有没有办法在两个不同的 bash 终端上同时运行两个不同的命令/指令?
- react-native - '?' 是什么意思?意思是反应原生
- javascript - 我对 angular 9 mat-tab-group 有疑问
- django - ForeignKey 如何决定参考?
- elasticsearch - Elasticsearch:使用分析器组合时搜索如何工作?
- python - 为什么在 python 逻辑语句中会发生这种情况?
- php - Codeigniter 访问在函数 2 上的函数 1 上定义的变量数据
- log4j2 - Log4J2 StatusLogger 消息未记录在 ODL 中
- android - Firebase App Distribution 未能获取应用信息:[400] 请求在多火库 Android 项目设置中包含无效参数
- reactjs - 使用 Firebase 反应登录功能