【问题标题】:Pagination for custom solr filter in active admin活动管理员中自定义 solr 过滤器的分页
【发布时间】:2014-06-19 07:37:13
【问题描述】:

我有一个针对活跃管理员的自定义洗劫过滤器:

# app/admin/user.rb
filter :by_solr_in, :as => :string

使用 solr 进行搜索:

# app/models/user.rb
ransacker :by_solr, formatter: -> (v) {
  ids = UserSearch.all({params: {q: v}, state: :all}).results.map(&:id)
  ids.present? ? ids : nil
} do |product|
  product.table[:id] # i think collection shoud be paginated here
end

Solr (UserSearch.all) 将所有找到的用户作为 id 的集合,product.table[:id] 从 db 中获取具有这些 id 的用户。问题是没有分页。活动管理员仅显示正确的页面,但每个页面的整个集合都来自 db。我该如何纠正这个问题?

我尝试在 before_filter 中将页面传递给 solr 并在那里使用它,但如果 solr 仅提供 1 个页面,则活动管理员仅获得 1 个页面。

ids = UserSearch.all({params: {q: v['q'], page: v['page'], per_page: 30}, state: :all}).results.map(&:id)

【问题讨论】:

    标签: ruby-on-rails solr activeadmin ransack


    【解决方案1】:

    我让它工作了。这不是完美的解决方案,但它可能会对某人有所帮助。

    在 before_filter 中,我为 ransacker 设置当前页面并将其从参数中删除。

    在 ransacker 中,我使用此页面并从 SolrPaginatedCollection 获取分页数据:

    results = UserSearch.all({params: {q: v, page: page, per_page: 30}, state: :all}).results
    UserSearch.admin_pagination_data = [results.total_pages, results.total_count, page || 1]
    

    在活动管理员中,我必须修改集合以显示正确的页面数据:

    def collection
      collection = super
      if params['q'].present? && params['q']['by_solr_in'].present? && UserSearch.admin_pagination_data.present?
        collection.define_singleton_method(:total_pages) { UserSearch.admin_pagination_data[0] }
        collection.define_singleton_method(:total_count) { UserSearch.admin_pagination_data[1] }
        collection.define_singleton_method(:current_page) { UserSearch.admin_pagination_data[2] }
      end
      collection
    end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-16
      • 1970-01-01
      • 2018-07-15
      相关资源
      最近更新 更多