我决定将此作为另一个答案发布,因为第一个答案太长了。
将评论通知呈现为您在
例如,您首先收集对某个目标用户有通知的 cmets(不要忘记将 has_one :notification 添加到 Comment 模型中)。
comments = Comment.joins(:notification).where(:notifications => { :target_user_id => current_user.id })
请注意,此处使用joins 会生成INNER JOIN,因此您可以正确排除任何没有通知的 cmets(因为某些通知可能已被用户删除)。
接下来,您希望将这些 cmets 按其可评论内容进行分组,以便您可以为每个可评论内容创建一个可展开的列表。
@comment_groups = comments.group_by { |c| "#{c.commentable_type}#{c.commentable_id}"}
这将生成像
这样的哈希
`{ 'Photo8' => [comment1, comment2, ...], 'Event3' => [comment1, ...], ... }`
您现在可以在视图中使用。
在some_page_showing_comment_notifications.html.erb
...
<ul>
<% @comment_groups.each do |group, comments| %>
<li>
<%= render 'comment_group', :comments => comments, :group => group %>
</li>
<% end %>
</ul>
...
在_comment_group.html.erb
<div>
<% case comments.length %>
<% when 1 %>
<%= comments[0].commenter.name %> commented on your <%= comment[0].commentable_type.downcase %>.
<% when 2 %>
<%= comments[0].commenter.name %> and <%= comments[1].commenter.name %> commented on your <%= comment[0].commentable_type.downcase %>.
<% when 3 %>
<%= comments[0].commenter.name %>, <%= comments[1].commenter.name %> and <%= comments[2].commenter.name %> commented on your <%= comment[0].commentable_type.downcase %>
<% else %>
<%= render 'long_list_comments', :comments => comments, :group => group %>
<% end %>
</div>
在_long_list_comments.html.erb
<div>
<%= comments[0].commenter.name %> and <%= comments.length-1 %> others commented on your <%= comments[0].commentable_type %>.
<%= button_tag "+", class: "expand-comments-button", id: "#{group}-button" %>
</div>
<%= content_tag :ul, class: "expand-comments-list", id: "#{group}-list" do %>
<li>
<% comments.each do |comment| %>
# render each comment in the same way as before
<% end %>
</li>
<% end %>
最后,在button.expand-comments-button 中添加一些javascript 来切换ul.expand-comments-list 的display 属性应该是一件简单的事情。每个按钮和列表都有一个基于评论组键的唯一 ID,因此您可以让每个按钮展开正确的列表。