在我的Rails 4应用程序中,我在博客和类别之间存在多对多关系,其中包含has_many:through =>加入表。
我正在使用gem will_paginate对博客文章页面进行分页。
但是对于每个页面,我想显示与每页显示的每篇博文相关的唯一类别。目前我有一个类似的查询:
Category.joins(:blogs).paginate(page: params[:page], per_page: 20).uniq
这适用于第一页,但对于第二页,当params [:page] == 2时,结果是一组空的类别,即使第二页包含带有类别的博客文章。
我该如何解决这个问题?
编辑:
动作:
def home
@categories = Category.joins(:blogs).paginate(page: params[:page], per_page: 20).uniq
@blogs = Blog.paginate(page: params[:page], per_page: 20)
respond_to do |format|
format.html
end
end
部分显示类别:
<ul class="filter">
<li><a class="active" href="" data-filter="*">All</a></li>
<% @categories.each do |category| %>
<li><a href="#" data-filter=".<%= category.title.downcase unless nil %>"><%= category.title unless nil %></a></li>
<% end %>
</ul>
与在行动中填充的博客和类别集合相比,此处的部分逻辑不太相关。
答案 0 :(得分:1)
如果我理解这个问题:您正在尝试使用其类别显示博客而不会重复。
然后你可以这样做:
blogs = Blog.includes(:categories).paginate(page: params[:page], per_page: 20)
没有理由显示一个类别超过1次,除非你复制了这个关系,但你必须防止它。
如果你这样做:
@categories = Category.joins(:blogs).paginate(page: params[:page], per_page: 20)
您最多可获得20个类别记录。他们每个人都有自己的博客。
您不能这样做:@blogs = Blog.paginate(page: params[:page], per_page: 20)
,因为您无法使用与@categories相同的params[:page]
分页,并且您已将博客数据附加到每个类别。
如果只设置了@categíes,您可以在您的视图中执行:
<% @categories.each do |category| %>
<%= "#{category.name} has #{category.blogs.size} blogs" %>
<% category.blogs.each do |blog|>
<%= blog.author %>
<% end %>
<% end %>
你根本不需要实例变量@blogs。
编辑:通过私人聊天透露答案:categories = []
blogs.each do |b|
categories.push(*b.categories)
end
categories.uniq
答案 1 :(得分:0)
如果您的数据库支持它,一个选项是使用子查询。所以:
Category
.all
.select("categories.*, (select count(blogs.id) from blogs where blogs.category_id = categories.id) as number_of_blogs")
.paginate(page: params[:page], per_page: 20)