8

很确定我在这里遗漏了一些非常简单的东西:

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

我正在使用 mislav-will_paginate,并且想知道是否有更好的方法来实现这一点?就像是:

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

将是理想的!

4

4 回答 4

7

好问题,我多次遇到同样的问题。每次,我都通过编写自己的基于 sql 联合的 sql 查询来结束它(它适用于 sqlite 和 mysql)。然后,您可以通过传递结果来使用将分页(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_for_conditions(即:sql 注入 ....)

于 2009-09-02T21:48:41.077 回答
1

你可以接近做类似的事情:

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

然后将使用页面参数profile_pagegroup_page. 您可以will_paginate使用以下方法在视图中调用以使用正确的页面:

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

不过,我不确定设置@groups@profiles单独设置是否有巨大的好处。

于 2009-07-07T21:19:57.957 回答
1

在我的上一个项目中,我遇到了一个问题,我不得不在我的搜索功能中使用单分页对多个模型进行分页。它应该以这样一种方式工作:当第一个模型的结果第二个模型应该继续结果时,第一个模型应该首先出现,第三个模型应该继续作为一个单一的搜索提要,就像 facebook 提要一样。这是我为执行此功能而创建的功能

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

于 2014-01-16T12:29:47.913 回答
0

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

于 2009-07-07T14:04:52.673 回答