You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 14:15:03