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