ruby-on-rails 将pagy和meilisearch集成到Rails中进行分页和搜索

cuxqih21  于 5个月前  发布在  Ruby
关注(0)|答案(1)|浏览(64)

如果我已经在使用Pagy,那么将pagy_search集成到我的索引中的最佳方法是什么?在我的控制器中,我目前有:

def index

    @gold_drivers = Driver.gold_plan
    @silver_drivers = Driver.silver_plan
    @free_drivers = Driver.free_plan

    @pagy, @drivers = pagy_array(
      @gold_drivers + @silver_drivers + @free_drivers,
      page: params[:page],
      items: 16
    )

    if params[:query].present?
      @drivers = @gold_drivers + @silver_drivers + @free_drivers
      drivers_search = Driver.pagy_search(params[:query])
      @pagy, @drivers = pagy_meilisearch(drivers_search, items: 25, page: params[:page])
    end
end

字符串
我有一个驱动程序模型,它将的委托给一个配置文件模型。不幸的是,当我点击搜索时,
Driver#first_name delegated to profile.first_name, but profile is nil: #<Driver id: 224...据我所知,此驱动程序没有配置文件,但对@gold_drivers = Driver.gold_plan / @银_drivers = Driver.银_plan等运行的查询不应选择没有配置文件的驱动程序。
Driver.gold_plan后面的查询是:

find_by_sql("SELECT drivers.*, (profiles.no_races + profiles.no_poles + profiles.no_podiums + profiles.no_wins) AS scores FROM drivers INNER JOIN profiles ON profiles.driver_id = drivers.id INNER JOIN subscriptions ON subscriptions.driver_id = drivers.id WHERE subscriptions.status = 'active' AND profiles.first_name != null OR profiles.first_name != '' AND subscriptions.stripe_plan = '#{ENV["GOLD_ANNUAL"]}' OR subscriptions.stripe_plan = '#{ENV["GOLD_MONTH"]}' GROUP BY scores, drivers.id ORDER BY scores DESC")


在这个查询中,我使用了"AND profiles.first_name != null OR profiles.first_name != ''",它在pagy_page部分工作,但不在pagy_search部分工作。
任何方向与此表示赞赏!

xxhby3vn

xxhby3vn1#

首先,你的代码效率很低,因为:
1.它执行3个查询而不是1个
1.它将所有记录拉入内存(可能会使服务器崩溃),并使用更多内存将它们连接到一个数组中,以创建另一个可能很大的对象
1.它使用pagy_array,不应该这样使用
所以让我们开始改变这一点。
1.不要使用+,而是创建一个单独的作用域,将3个作用域(gold、银、plan)进行OR运算(也应该是AR关系,而不是文字查询)。
1.直接使用AR关系pagy而不是pagy_array:这将只提取您需要的记录页,而不是您不需要的全部记录
1.对pagy_meilisearch使用相同的AR关系,你的问题可能会消失,而不需要进一步的修改。如果不会,那就看看你的范围。

相关问题