Показать все комментарии к сообщению, но показать имя пользователя только один раз - PullRequest
0 голосов
/ 01 февраля 2019

В конкретном сообщении 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 голосов
/ 01 февраля 2019
users = @post.comments.group_by(&:user)

users теперь является хэшем, который будет выглядеть следующим образом:

{“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 isхэш, поэтому он может быть отсортирован тоже

<%users.keys.sort.each do |author|
  <h1><%= link_to author.username, author %> says: </h1><br>
  <%users[author].each do |comment|%>
    <%=comment.body%><br />
  <%end%>
<%end%>
0 голосов
/ 01 февраля 2019

Вы можете использовать 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 проблему , вы должны загрузить комментарии в подзапросе

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...