我在一个页面上显示了一个对话列表。这些对话中的每一个都充满了两个用户之间的消息。
一个会话有一条消息(主消息,充当该会话中其他消息的父消息)(_O)。对话列表当前排序如下:
default_scope :order => 'conversations.updated_at DESC'
我更喜欢使用最新发布的消息created_at或updated_at时间/日期来排序列表。为了获得最近发布的消息,我可以做这个
c = Conversation.find(4)
c.message.children.last
然后从那里我可以访问我想要的列。以下是我目前拥有的。有没有办法对此进行调整,以便它访问我的Messages表,从刚刚发布的消息中获取created_at和updated_at数据,并使用这些数据来排序上面提到的Conversation列表?
class Conversation < ActiveRecord::Base
belongs_to :message
default_scope :order => 'conversations.updated_at DESC'
class Message < ActiveRecord::Base
acts_as_tree
has_one :conversation
亲切问候
为了执行您想要的操作,您需要加入消息表,按会话id分组,并按updated_at的聚合函数排序。翻译成Rails,类似于:
default_scope { select("conversations.*, max(messages.updated_at) as last_update").join(:messages).group("conversations.id").order("last_update desc") }
我假设的是Rails 3,尽管default_scope的第一个定义似乎表示Rails 2。如果是这样,您将不得不相应地修改我的代码。