2014-01-28 52 views
0

我收到了一个消息列表。它们按'from'字段进行分组,并由created_at进行排序。如何在group_中订购记录

它们显示,像这样的企业显示了看法:

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

既然你想让它上升的阵列,为什么不'范围:最新的,顺序是:“created_at ASC”'? – KappaNossi

+0

@KappaNossi我认为这些组织应该是命令'ASC',而组中的行应该在同一个字段上命令'DESC',否则我不会看到问题出在哪里。 –

+0

正确。我希望首先与最新消息进行对话,但在该对话中它应该最后显示 – grabury

回答

0

既然你想让它升序,只是改变你的范围

​​

这会工作!

+0

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

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!)。

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 %>