我决定将此作为另一个答案发布,因为第一个答案太长了。
要将评论通知呈现为您在示例中提到的可扩展列表,您首先收集具有某些目标用户通知的评论(不要忘记添加has_one :notification
到Comment
模型中)。
comments = Comment.joins(:notification).where(:notifications => { :target_user_id => current_user.id })
请注意,joins
此处的使用会生成一个INNER JOIN
,因此您可以正确排除任何没有通知的评论(因为某些通知可能已被用户删除)。
接下来,您希望按评论对这些评论进行分组,以便您可以为每个评论创建一个可展开的列表。
@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 %>
最后,添加一些 javascript来button.expand-comments-button
切换display
. ul.expand-comments-list
每个按钮和列表都有一个基于评论组键的唯一 ID,因此您可以让每个按钮展开正确的列表。