ActiveRecord加入了两个模型,will_paginate无法获得独特的多对多关系?

时间:2014-10-31 15:00:35

标签: ruby-on-rails ruby join activerecord will-paginate

在我的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>

与在行动中填充的博客和类别集合相比,此处的部分逻辑不太相关。

2 个答案:

答案 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)