活动管理员中自定义solr过滤器的分页

时间:2014-06-19 07:37:13

标签: ruby-on-rails solr activeadmin ransack

我有一个用于主动管理员的自定义搜索过滤器:

# 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的用户。问题是没有分页。 Active admin仅显示正确的页面,但每个页面的整个集合都来自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)

1 个答案:

答案 0 :(得分:0)

我得到了它的工作。这不是完美的解决方案,但它可能有助于某人。

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

在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