【问题标题】:How to use will_paginate with Sunspot Solr如何在 Sunspot Solr 中使用 will_paginate
【发布时间】:2014-11-21 15:39:09
【问题描述】:

我的问题在这里非常具体。我有一组来自太阳黑子查询的结果,

  @search = Product.search do
    with(:website_id, id)
    with(:archived_at, nil)
    with(:category_id, restrictive_category_ids)
    fulltext search_string do
      phrase_fields(:name => 1, :artist => 3, :tag_list => 2)
      minimum_match 0 #enables search to be performed by each word, not the whole phrase.
    end
    paginate :page => 1, :per_page => 2
  end

  @products = @search.results

这会产生多页结果,每页 2 个。所有这些都在控制台中使用 Sunspot 进行了验证。

我的问题是尝试将结果与 will_paginate 一起使用。例如在视图中:

<%= will_paginate @products, param_name: 'products', class: 'pagination-nav' %>

由于@products 在初始查询中只返回 2 个结果,will_paginate 认为只有 2 个结果,因此甚至没有出现。如果我用 Product.all 替换 @products,它显然会出现并显示结果页面。

所以我不确定我需要做什么来告诉 will_paginate 实际有多少结果,所以它知道要显示多少页。当然,我可以对所有这些记录进行单独的查询,但这会对应用程序造成很大的拖累,并且鉴于 Sunspot 声称可以使用 will_paginate,我假设一定有更简单的方法。

感谢您的帮助!

【问题讨论】:

    标签: solr will-paginate sunspot-rails


    【解决方案1】:

    我找到了答案。

    我需要使用@search.hits,而不是在视图的“will_paginate”方法中使用@search.results。

    使用“命中”是关键。 "results" 仅返回 model.search 方法中分页方面的结果数量。另一方面,“hits”提供了一个记录数组,反映了整个搜索的数量,因此允许分页结果正常工作。

    【讨论】:

    • @wiwit 在示例中不要将 @products 传递给 will_paginate,而是将其传递给 @search.hits@search.hits 对 total_pages、当前页面等的响应方法相同,因此链接正确。
    【解决方案2】:

    从 solr 获取结果,然后通过 solr 返回的 id 搜索您的模型并对其进行分页,如下所示:

    @search = Sunspot.search(Snippet) do
       fulltext params[:search]
    end
    @styles = Product.where(id: @search.hits.map(&:primary_key)).paginate(page: params[:page], per_page: 3)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多