我正在创建一个搜索页面,该页面将对用户,帖子和评论进行广泛的搜索。我目前有:

# 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

但是,我真的在尝试获得所有结果混合在一起然后分页的东西。这样的分页搜索有哪些策略?谢谢!

有帮助吗?

解决方案

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

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

每个对象都需要具有实例方法“分数”,该实例方法将根据查询优先级对其进行排序。另外,您将需要修改视图以处理每个项目的正确渲染,并确保在模型上调用分页最多。

另外,一种更健壮的方法是添加全文搜索服务(例如 索引坦克, Web Solr, 思考狮身人面像)。这些动作的热门技术的技术很快,因此请进行一些研究并找到适合您需求的技术。示例语法将是:

User.multi_solr_search query, models: [Post, Comment]

其他提示

自从这个提交以来: https://github.com/amatsuda/kaminari/commit/f9f529fb689feea3877777773a4c625c1b14859128

你可以做以下

在您看来,您可以做到这一点:

<%= 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) %>');

您可以将查询中的结果结合在一起,并在其中运行页面。

users = User.search(query)
posts = Post.search(query)
comments = Comment.search(query)
@results = users + posts + comments
@results.page(params[:page])
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top