代码之家  ›  专栏  ›  技术社区  ›  Codebeef

将与多个型号(轨道)一起使用

  •  8
  • Codebeef  · 技术社区  · 15 年前

    我肯定我遗漏了一些非常简单的东西:

    我正在尝试显示一系列包含两个不同模型(配置文件和组)实例的页面。我需要他们按名字属性排序。我可以为每个模型选择所有实例,然后对它们进行排序和分页,但这会让人感觉草率和低效。

    我正在使用mistrav-will-paginate,想知道是否有更好的方法来实现这个目标?比如:

    [Profile, Group].paginate(...)
    

    将是理想的!

    4 回复  |  直到 11 年前
        1
  •  7
  •   Di    15 年前

    好问题,我也碰到过同样的问题。每次,我都会根据SQL联合编写自己的SQL查询来结束它(它可以与sqlite和my sql一起工作)。然后,您可以通过传递结果来使用will paginate( http://www.pathf.com/blogs/2008/06/how-to-use-will_paginate-with-non-activerecord-collectionarray/ )不要忘记执行查询来计算所有行。

    一些代码行(未测试)

    my_query = "(select posts.title from posts) UNIONS (select profiles.name from profiles)"
    total_entries = ActiveRecord::Base.connection.execute("select count(*) as count from (#{my_query})").first['count'].to_i
    
    results = ActiveRecord::Base.connection.select_rows("select * from (#{my_query}) limit #{limit} offset #{offset}")
    

    是不是被杀得太多了?也许吧,但是你已经得到了最少数量的查询,并且结果是一致的。

    希望它有帮助。

    注意:如果从HTTP参数获取偏移值,则应使用sanitize_-sql_表示_条件(即:SQL注入….)。

        2
  •  1
  •   Shadwell    15 年前

    你可以做一些类似的事情:

    @profiles, @groups = [Profile, Group].map do |clazz|
      clazz.paginate(:page => params[clazz.to_s.downcase + "_page"], :order => 'name')
    end
    

    然后使用页面参数分页 profile_page group_page . 你可以得到 will_paginate 调用视图以使用正确的页面,方法是:

    <%= will_paginate @profiles, :page_param => 'profile_page' %>
    ....
    <%= will_paginate @groups, :page_param => 'group_page' %>
    

    不过,我不确定设立公司会有什么好处 @groups @profiles 个别地。

        3
  •  1
  •   Emad Elsaid    11 年前

    在我的上一个项目中,我陷入了一个问题,在我的搜索功能中,我不得不用一个分页来分页多个模型。 它的工作方式应该是,当第一个模型的结果出现时,第一个模型应该首先出现,当第二个模型的结果继续出现时,第三个模型应该作为一个单一的搜索源出现,就像facebook feeds一样。 这是我创建的用于执行此功能的函数

    def multi_paginate(models, page, per_page)
    
      WillPaginate::Collection.create(page, per_page) do |pager|
    
        # set total entries
        pager.total_entries = 0
        counts = [0]
        offsets = []
        for model in models
              pager.total_entries += model.count
              counts << model.count
              offset = pager.offset-(offsets[-1] || 0)
              offset = offset>model.count ? model.count : offset 
              offsets << (offset<0 ? 0 : offset)
        end
    
        result = []
        for i in 0...models.count
              result += models[i].limit(pager.per_page-result.length).offset(offsets[i]).to_a
        end
    
        pager.replace(result)
      end
    
    end
    

    尝试一下,让我知道你是否有任何问题,我也把它作为一个问题发布到will-paginate存储库,如果每个人都确认它工作正常,我将分叉并提交给库。 https://github.com/mislav/will_paginate/issues/351

        4
  •  0
  •   pantulis    15 年前

    您是否尝试使用自己的分页器显示两组不同的结果并通过Ajax更新它们?这不完全是你想要的,但是结果是相似的。