Ruby on Rails使用pluck提取表中去重日期并在ERB视图展示
思路评估
你当前的思路只能拿到去重后的日期数组,丢失了对应会议的全量字段数据,无法直接适配现有需要渲染会议完整信息的表格视图,因此不可直接使用。
更优实现方案
推荐按照「控制器层分组数据 + 视图层按分组渲染」的逻辑实现,符合Rails MVC分层规范,仅需一次数据库查询,性能和可维护性更好。
第一步:控制器处理数据
在MeetingsController的index动作中对会议数据按日期分组:
def index # 先按会议开始时间正序排序 meetings = Meeting.order(start_date: :asc) # 按开始日期分组,返回结构为 {日期 => [当日会议数组]} 的哈希 @grouped_meetings = meetings.group_by { |meeting| meeting.start_date.to_date } end
第二步:修改视图渲染逻辑
提供两种常用的渲染方式,可根据设计需求选择:
方式1:日期单独占行展示(可读性更高)
<h1>Meetings</h1> <table class="table"> <thead class="thead-dark"> <tr> <th>Name</th> <th>Start time</th> <th>End time</th> <th>Duration</th> <th>Duration Time</th> </tr> </thead> <tbody> <% @grouped_meetings.each do |date, meetings| %> <!-- 日期跨列单独展示 --> <tr class="table-secondary"> <td colspan="5"><strong><%= date.strftime("%d-%b-%Y") %></strong></td> </tr> <% meetings.each do |meeting| %> <tr> <td><%= meeting.name %></td> <td><%= meeting.start_date.strftime("%I:%M %p") %></td> <td><%= meeting.end_date.strftime("%I:%M %p") %></td> <td><%= meeting.duration %></td> <td><%= duration_display meeting %></td> </tr> <% end %> <% end %> </tbody> </table> <br><br>
方式2:合并日期单元格(保持原表格结构)
<h1>Meetings</h1> <table class="table"> <thead class="thead-dark"> <tr> <th>Date</th> <th>Name</th> <th>Start time</th> <th>End time</th> <th>Duration</th> <th>Duration Time</th> </tr> </thead> <tbody> <% @grouped_meetings.each do |date, meetings| %> <% meetings.each_with_index do |meeting, index| %> <tr> <!-- 仅当前是当日第一条会议时渲染日期单元格,合并行数等于当日会议数 --> <% if index == 0 %> <td rowspan="<%= meetings.size %>"><%= date.strftime("%d-%b-%Y") %></td> <% end %> <td><%= meeting.name %></td> <td><%= meeting.start_date.strftime("%I:%M %p") %></td> <td><%= meeting.end_date.strftime("%I:%M %p") %></td> <td><%= meeting.duration %></td> <td><%= duration_display meeting %></td> </tr> <% end %> <% end %> </tbody> </table> <br><br>
如果你的会议数据量超过万级,可以改用SQL层面的分组逻辑,进一步降低Ruby层面的运算开销。
内容的提问来源于stack exchange,提问作者Sarah Duffy
相关产品推荐
相关产品推荐

