ruby CanCanCan、Pagy和MeiliSearch,如何合并这3个宝石?

zvms9eto  于 2023-04-29  发布在  Ruby
关注(0)|答案(1)|浏览(142)

我在一个项目,有提示模型,可以访问和搜索的多个角色,如客人和管理员。基于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字符串中,并将所需的参数添加到索引中。但这将是复杂的,它将增加索引大小。你有什么想法吗

iih3973s

iih3973s1#

just hint

当在meilisearch中搜索没有直接读取CanCan中当前的能力时,可以在application_record中处理以获取所有CanCan能力并在www.example中覆盖 www.example.com
你看这个我们不叫can can
可以在app/models/application_recored.rb

def ms_search(query, params = {})
   # cancan_params should here merge cancan_params and get params
   # to search with cancan params
    params.merge!(cancan_params)
    super(query, params)
end

相关问题