显示帖子中的所有评论,但仅显示一次用户名

时间:2019-02-01 12:13:06

标签: ruby-on-rails sqlite

在一个特定的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`

2 个答案:

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