【问题标题】:Paginate Multiple Models in Kaminari在 Kaminari 中为多个模型分页
【发布时间】:2011-09-12 16:20:49
【问题描述】:

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

# 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

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

【问题讨论】:

    标签: ruby-on-rails ruby search pagination kaminari


    【解决方案1】:

    自从这次提交: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) %>');
    

    【讨论】:

    • Michael,感谢您提供非常好的、清晰和简洁的答案。如果您可以使用必要的 JavaScript 扩展您的答案来处理这种情况,那将非常有帮助。我是一个 javascript 新手,正在努力尝试让 Kaminari 作者的 javascript 示例跨多个模型工作。
    • 这里有很棒的信息!帮助我解决了我遇到的问题。
    • @Don 为无需 javascript 的快速简单解决方案,只需删除 ":remote => true"。
    • @Michael K Madison 关于被问到的任何线索?我也很纠结于 javascript 部分。
    • @PetrosKyriakou 希望我的额外编辑能更好地说明问题。
    【解决方案2】:

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

    @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]
    

    【讨论】:

      【解决方案3】:

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

      users = User.search(query)
      posts = Post.search(query)
      comments = Comment.search(query)
      @results = users + posts + comments
      @results.page(params[:page])
      

      【讨论】:

      • kaminaripaginate 这样的 gem 的部分好处是它们使用 SQL limitoffset 子句。如果你以这种方式解决问题,你就会失去这种好处!
      • 啊,哎呀。糟糕的是,我建议全文搜索,因为使用 AR 进行搜索感觉就像一个丑陋的黑客攻击。
      • @KevinSylvestre 您是否找到了一个好的解决方法,而不是将所有这些模型保存在一个表中?很高兴在这里见到你!
      猜你喜欢
      • 1970-01-01
      • 2011-08-02
      • 2014-06-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-04
      • 2011-07-27
      相关资源
      最近更新 更多