1

我有一个页面上显示的对话列表。这些对话中的每一个都充满了 2 个用户之间的消息。

一个会话 has_one 消息(作为该会话其他消息的父级的主消息)。对话列表目前的排序如下:

default_scope :order => 'conversations.updated_at DESC'

我更喜欢使用最近发布的消息 created_at 或 updated_at 时间/日期对列表进行排序。要获取最近发布的消息,我可以这样做

c = Conversation.find(4)
c.message.children.last

然后从那里我可以访问我想要的列。以下是我目前拥有的。有没有办法对此进行调整,以便它访问我的 Messages 表并从刚刚发布的消息中获取 created_at 和 updated_at 数据,并使用它来订购上面提到的对话列表?

class Conversation < ActiveRecord::Base

   belongs_to :message

   default_scope :order => 'conversations.updated_at DESC'



class Message < ActiveRecord::Base

  acts_as_tree
  has_one :conversation

亲切的问候

4

1 回答 1

1

为了做你想做的事,你需要加入messages表,按对话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。如果是这样,你必须相应地修改我的代码。

于 2013-02-05T20:39:45.690 回答