如何在group_by中订购记录

时间:2014-01-28 11:51:49

标签: ruby-on-rails ruby

我收到了一条消息列表。它们按“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

3 个答案:

答案 0 :(得分:0)

由于您希望升序,只需将范围更改为

即可
scope :newest, order: "created_at asc"

这会有效!

答案 1 :(得分:0)

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

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

此代码将散列作为键/值对循环,并对值(您的消息)进行排序。排序直接应用于引用的值对象(请注意哈希值中的!sort!)。

答案 2 :(得分:0)

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

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