【问题标题】:How to order records within a group_by如何对 group_by 中的记录进行排序
【发布时间】:2014-01-28 20:37:51
【问题描述】:

我有收到的邮件列表。它们按 'from' 字段分组,并按 created_at 排序。

它们在商家展示视图中显示如下:

From: Tom
10pm Message7
8pm Message4
6pm Message2

From: Sara
9pm Message6
7pm Message3
5pm Message1

From: John
8pm Message5

在我的业务控制器中:

@messages = @business.short_messages.newest.group_by &:from

在 short_messages 模型中,我有范围:

scope :newest, order: "created_at desc"

在我看来:

<% @messages.each do |from, message| %>
 <p><%= from %></p>
 <% message.each do |msg| %>
  <p><%= msg.created_at %> <%= msg.content %></p>
 <% end %>
<% end %>

对话的分组和排序没问题。

问题是我希望首先与最新消息进行对话,但在该对话中它应该最后显示

From: Tom
6pm Message2
8pm Message4
10pm Message7

From: Sara
5pm Message1
7pm Message3
9pm Message6

From: John
8pm Message5

【问题讨论】:

  • 既然你想让它上升,为什么不直接scope :newest, order: "created_at ASC"
  • @KappaNossi 我认为组应该按ASC 排序,而组中的行应该在同一字段上按DESC 排序,否则我看不出问题出在哪里应该是。
  • 正确。我希望首先与最新消息进行对话,但在该对话中它应该最后显示

标签: ruby-on-rails ruby


【解决方案1】:

既然你想要它升序,只需将你的范围更改为

scope :newest, order: "created_at asc"

这行得通!

【讨论】:

  • 我希望最先显示最新消息的对话,但在该对话中它应该最后显示
【解决方案2】:

我相信您无法在单个数据库请求中执行此操作,因此您需要在之后手动执行此操作。试试这个:

@messages = @business.short_messages.newest.group_by &:from
@messages.each_pair { |k,v| v.sort!{|a,b| a.created_at <=> b.created_at} }

此代码以键/值对的形式循环遍历哈希并对值(您的消息)进行排序。排序直接应用于哈希中引用的值对象(注意sort! 中的!)。

【讨论】:

    【解决方案3】:

    在视图中使用reverse_each反向循环遍历数组

    <% @messages.each do |from, message| %>
     <p><%= from %></p>
     <% message.reverse_each do |msg| %>
      <p><%= msg.created_at %> <%= msg.content %></p>
     <% end %>
    <% end %>
    

    【讨论】:

      猜你喜欢
      • 2021-04-04
      • 2023-02-24
      • 2016-07-09
      • 1970-01-01
      • 2019-08-04
      • 2016-03-02
      • 2011-09-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多