代码之家  ›  专栏  ›  技术社区  ›  anonn023432

预览对话中的最后一条消息

  •  2
  • anonn023432  · 技术社区  · 7 年前

    我有一个 Conversation 型号 has_many messages 。我想提取用户的所有对话,并显示最后的对话 message 预览给用户。我的做法如下:

    Conversations_controller :

    def index
      @conversations = Conversation.includes(:messages)
                                   .get_seller_conversations(@seller)
    end
    

    会话 型号:

    def self.get_seller_conversations(seller)
      @conversations = seller.conversations
                             .includes(buyer: :user)
                             .joins(:messages)
                             .where(messages: { only_for_buyer: false })
                             .distinct
      new.sorted_conversations(@conversations)
    end
    
    
    def sorted_conversations(conversations)
      conversations.sort_by { |c| c.messages.last.created_at }
      .reverse
    end
    

    index.json.jbuilder -&燃气轮机;看法

    json.array!(@conversations.reject { |c| c.messages == [] }.map do |c|
      x = c.messages.last
      { ...
        ...
        preview: x.content ? x.content[0..100] : x.attachment_url }
    end)
    

    因此,我必须将所有消息拉到这里,对对话进行排序,并显示最后一条消息的预览。有没有一种方法可以让我在每次对话中只提取最后一条信息,从而提高效率?

    1 回复  |  直到 7 年前
        1
  •  2
  •   elyalvarado    7 年前

    您可以在 Conversation 模型到其最后一条消息:

    has_one :last_message, -> { order(created_at: :desc) }, source: :message

    然后在你的搜索中 Conversation.includes(:messages) 是的 Conversation.includes(:last_message)