Rails由协会分组的方式

时间:2015-10-29 14:02:42

标签: ruby-on-rails ruby

我知道我使这比它需要的更困难。必须有一种完成此任务的轨道方式。为了演示:这里有两个模型:

#app/models/user.rb
class User < ActiveRecord::Base
  has_many :blogs

  def to_s
    name
  end
end

#app/models/blog.rb
class Blog < ActiveRecord::Base
  belongs_to :user
    delegate :name, to: :user, prefix: true, allow_nil: true

  def to_s
    title
  end
end

所以我想做的是将所有blogs分组到关联的user。然后,我想列出每blogsuser

关键详情:并非所有blogs都有关联的user。有些人user_id = nil。以下是要展示的博客列表(最后两个博客有user_id = nil):

listing blogs

所以我得到了我想要的工作。但是解决方案并不容易阅读,我知道必须有一些方法可以使用Rails' query interface来实现这一目标。我无法理解,所以我在下面将我自己的解决方案整合在一起:

#app/controllers/admin_controller.rb
class AdminController < ApplicationController
  def index
    @group_blogs_by_user = {}
    User.all.pluck(:name).each{|user| @group_blogs_by_user[user] = []}
    @group_blogs_by_user[nil] = [] #provide nil category when no user_id was specified for a blog

    Blog.all.each {|blog| @group_blogs_by_user[blog.user_name].push(blog)}

    @group_blogs_by_user.reject!{ |_ , v|v.empty?} #do not show users that have no blogs
  end
end

以下是显示它的视图:

#app/views/admin/index.html.erb
<h1>Showing Count of Blogs per User</h1>
<table>
  <thead>
    <th>User</th>
    <th>Blogs Count</th>
  </thead>
  <tbody>
        <% @group_blogs_by_user.each do |user, blogs_of_this_user| %>      
        <tr>
      <td><%= user || "No User Specified"%></td>
      <td><%= blogs_of_this_user.size %></td>
    </tr>
  <% end %>
  </tbody>
</table>

<hr>

<h1>Showing Breakdown of Blogs per User</h1>
<% @group_blogs_by_user.each do |user, blogs_of_this_user| %>
  <h3><%= (user || "No User Specified") + " (#{blogs_of_this_user.size} blogs)" %></h3>
  <table class="table">
    <thead>
        <th>Blog ID</th>
        <th>Created At</th>
    </thead>
    <tbody>
    <% blogs_of_this_user.each do |blog| %>
      <tr>
        <td> <%= link_to(blog.id, blog)%></td>
        <td> <%= blog.created_at.strftime("%d-%m-%Y")%></td>
      </tr>
    <% end %>
    </tbody>
  </table>
<% end %>

以下是它呈现的内容,这就是我想要的内容:

Blogs Grouped by User

我一直遇到这种情况,我希望通过某种关联对表进行分组,我发现自己不断地将解决方案混为一谈。我如何使用Rails&#39;查询接口?

1 个答案:

答案 0 :(得分:2)

从用户获取所有博客并打印用户名,blog_id和博客计数

<% @users.each do |user| %>
    <%= user.name %>
    <%= user.blogs.count %>
    <% user.blogs.each do |blog|%>
        <%= blog.id %>
    <% end %>
<% end %>

获取没有用户的博客数量

<%= Blog.where(user: nil).count %>

我希望我的问题正确,这有帮助!