很确定我在这里遗漏了一些非常简单的东西:
我正在尝试显示一系列包含两个不同模型实例的页面 - 配置文件和组。我需要他们按名称属性排序。我可以为每个模型选择所有实例,然后对它们进行排序和分页,但这感觉草率且效率低下。
我正在使用 mislav-will_paginate,并且想知道是否有更好的方法来实现这一点?就像是:
[Profile, Group].paginate(...)
将是理想的!
很确定我在这里遗漏了一些非常简单的东西:
我正在尝试显示一系列包含两个不同模型实例的页面 - 配置文件和组。我需要他们按名称属性排序。我可以为每个模型选择所有实例,然后对它们进行排序和分页,但这感觉草率且效率低下。
我正在使用 mislav-will_paginate,并且想知道是否有更好的方法来实现这一点?就像是:
[Profile, Group].paginate(...)
将是理想的!
好问题,我多次遇到同样的问题。每次,我都通过编写自己的基于 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 注入 ....)
你可以接近做类似的事情:
@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
单独设置是否有巨大的好处。
在我的上一个项目中,我遇到了一个问题,我不得不在我的搜索功能中使用单分页对多个模型进行分页。它应该以这样一种方式工作:当第一个模型的结果第二个模型应该继续结果时,第一个模型应该首先出现,第三个模型应该继续作为一个单一的搜索提要,就像 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
您是否尝试过使用自己的分页器显示两组不同的结果并通过 AJAX 更新它们?这不完全是你想要的,但结果是相似的。