我知道我使这比它需要的更困难。必须有一种完成此任务的轨道方式。为了演示:这里有两个模型:
#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
。然后,我想列出每blogs
个user
。
关键详情:并非所有blogs
都有关联的user
。有些人user_id = nil
。以下是要展示的博客列表(最后两个博客有user_id = nil
):
所以我得到了我想要的工作。但是解决方案并不容易阅读,我知道必须有一些方法可以使用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 %>
以下是它呈现的内容,这就是我想要的内容:
我一直遇到这种情况,我希望通过某种关联对表进行分组,我发现自己不断地将解决方案混为一谈。我如何使用Rails&#39;查询接口?
答案 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 %>
我希望我的问题正确,这有帮助!