Stu*_*ssa 22 ruby search pagination ruby-on-rails kaminari
我正在创建一个搜索页面,可以对用户,帖子和评论进行应用程序范围的搜索.我目前有:
# 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
Run Code Online (Sandbox Code Playgroud)
然而,我真的想要得到一些所有结果混合在一起然后分页的东西.这样做分页搜索的策略是什么?谢谢!
Mic*_*son 51
自从这次提交以来: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" %>
Run Code Online (Sandbox Code Playgroud)
然后在你的控制器中你可以用这种方式引用它们:
@users = User.search(query).page(params[:user_page])
@posts = Post.search(query).page(params[:post_page])
@comments = Comment.search(query).page(params[:comment_page])
Run Code Online (Sandbox Code Playgroud)
和你的视图的js.erb你可能有类似的东西:
$('#posts').html('<%= escape_javascript render(@posts) %>');
$('.table-pager').html('<%= escape_javascript(paginate(@posts, :remote => true).to_s) %>');
Run Code Online (Sandbox Code Playgroud)
在考虑解决方案之前,您需要首先准确定义您想要的最终结果。如果您想在结果页面上显示每种类型的记录中的一些,您可以修改您发布的方法并使用以下方法组合三个分页结果:
@results = @users + @posts + @comments
@results.sort! { |a, b| a.score(query) > b.score(query) }
Run Code Online (Sandbox Code Playgroud)
每个对象都需要有一个实例方法“score”,让它根据查询优先级进行排序。此外,您还需要修改视图以处理每个项目的正确渲染,并确保在具有最多页面的模型上调用分页。
或者,更可靠的方法是添加全文搜索服务(例如Index Tank、Web Solr、Thinking Sphinx)。这些热门技术的发展速度很快,因此请进行一些研究并找到适合您需求的技术。示例语法如下:
User.multi_solr_search query, models: [Post, Comment]
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
6860 次 |
最近记录: |