22

我正在创建一个搜索页面,它将对用户、帖子和评论进行应用程序范围的搜索。我目前有:

# POST /search
def index
  query = params[:query]
  @users = User.search(query).page(params[:page])
  @posts = Post.search(query).page(params[:page])
  @comments = Comment.search(query).page(params[:page])

  respond_to do |format|
    format.html
  end
end

但是,我真的在尝试将所有结果混合在一起然后分页。像这样进行分页搜索的一些策略是什么?谢谢!

4

3 回答 3

52

自从这次提交:https ://github.com/amatsuda/kaminari/commit/f9f529fb68ab89feea38773a4c625c1b14859128

您可以执行以下操作

在您看来,您可以这样做:

<%= paginate @users, :remote => true, :param_name => "user_page" %>
<%= paginate @posts, :remote => true, :param_name => "post_page" %>
<%= paginate @comments, :remote => true, :param_name => "comment_#{some_post_id}_page" %>

然后在您的控制器中,您可以通过这种方式引用它们:

@users = User.search(query).page(params[:user_page])
@posts = Post.search(query).page(params[:post_page])
@comments = Comment.search(query).page(params[:comment_page])

和你的观点的 js.erb 你可能有类似的东西:

$('#posts').html('<%= escape_javascript render(@posts) %>');
$('.table-pager').html('<%= escape_javascript(paginate(@posts, :remote => true).to_s) %>');
于 2011-07-17T03:16:13.267 回答
1

在考虑解决方案之前,您需要首先准确定义您想要的最终结果。如果您想在结果页面上显示每种类型的记录中的一些,您可以修改您发布的方法并使用以下方法组合三个分页结果:

@results = @users + @posts + @comments
@results.sort! { |a, b| a.score(query) > b.score(query) }

每个对象都需要一个实例方法'score',让它根据查询优先级进行排序。此外,您需要修改视图以处理每个项目的正确呈现,并确保在具有最多页面的模型上调用分页。

或者,更稳健的方法是添加全文搜索服务(例如Index TankWeb SolrThinking Sphinx)。这些技术的热门技术可以快速移动,因此请进行一些研究并找到适合您需求的技术。示例语法类似于:

User.multi_solr_search query, models: [Post, Comment]
于 2011-06-10T17:43:43.710 回答
-1

您可以结合查询结果并在其上运行页面。

users = User.search(query)
posts = Post.search(query)
comments = Comment.search(query)
@results = users + posts + comments
@results.page(params[:page])
于 2011-06-10T17:23:56.097 回答