在一个特定的Users
后,我想告诉所有的意见,但出现在特定的用户名只有一次。
我已经有一个Post
模型与其所有Comments
相关联。 Comments
与它们的Users
相关联。但是我不知道怎么只显示给定用户的用户名一次。所以代替:
User1: "I commented First"
User2: "I commented Second"
User1: "I'm commenting Again!!!!"
User1: "And....Again!"
我应该有:
User1: "I commented First"
"I'm commenting Again!!!!"
"And....Again!"
User2: "I commented Second"
此代码设法在页面上显示所有注释。
<% @post.comments.each do |comment| %>
<% if comment.id %>
<%= link_to comment.user.username, comment.user %> says: <%= comment.content %><br>
<% end %>
<% end %>
但是它只能显示一次带有所有用户名注释的用户名。
当前是:
`User` `has_many :comments`, `has_many :posts, through: :comments`
`Post` `has_many :comments`, `has_many :users, through: :comments`
`Comment` `belongs_to :user`, `belongs_to :post`
答案 0 :(得分:2)
您可以使用group_by
。通过指定&:user
,我们告诉group_by
我们要根据每个评论的user
属性的结果进行分组,这是示例:
<% @post.comments.group_by(&:user).each do |user, comments| %>
#- user variable contains a user record
#- comments is an array of comments
<%= link_to user.username, user %> <%= comments.map(&:content) %>
<% end %>
此示例仅向您展示了一种方法。
实际上,这种方式将生成N+1 problem,您应该在子查询中加载评论
答案 1 :(得分:0)
FirebaseMessagingService
用户现在是散列,将看起来像这样:
users = @post.comments.group_by(&:user)
因此,它可以被重复用于所述用户评论
{“George Brassens” => [#<Comment id:131 …>, #<Comment id:331 …>], “Billie Holiday” => [#<Comment id:111 …>, #<Comment id:911 …>] }
实际上<%users.each_pair do |user, comments|
<h1><%= link_to user.username, user %> says:</h1><br>
<%comments.each do |comment| %>
<%=comment.body%><br />
<%end%>
<%end%>
是散列因此它可以被过排序
users