我在一个项目,有提示模型,可以访问和搜索的多个角色,如客人和管理员。基于Ability类中编写的一些逻辑,使用CanCanCan gem进行授权。而搜索使用Pagy/MeiliSearch组合进行全文搜索和分页。我现在面临的问题是,当我搜索作为一个客人,我可以看到正确的项目,客人应该看到,当我搜索作为一个管理员,我可以看到正确的项目管理员应该看到,但佩吉宝石计数是不正确的。这是我的代码:
class SearchesController < ApplicationController
INCLUDES = %i[medium speakers].freeze
include Pagy::Backend
authorize_resource class: false
def search
filter = ''
filter = "speaker_ids IN [#{params[:speaker]}]" if params[:speaker].present?
search_results = Cue.accessible_by(current_ability).includes(INCLUDES).pagy_search(params[:query], filter:)
@pagy, @search_results = pagy_meilisearch(search_results)
end
end
如果访客无法访问某些提示,则搜索不会在@search_results
中返回它们,但@pagy
对象会将它们计算在内。这向用户显示了不正确的计数,并且还显示了小于所需的Pagy::DEFAULT[:items]
。我尝试了很多方法,但都没有成功。我唯一能想到的(我不想走这条路TBH)是将过滤逻辑本身添加到filter
字符串中,并将所需的参数添加到索引中。但这将是复杂的,它将增加索引大小。你有什么想法吗
1条答案
按热度按时间iih3973s1#
当在meilisearch中搜索没有直接读取CanCan中当前的能力时,可以在application_record中处理以获取所有CanCan能力并在www.example中覆盖 www.example.com
你看这个我们不叫can can
可以在
app/models/application_recored.rb
中