会话中的最后一条消息供预览

时间:2018-04-25 19:57:29

标签: ruby-on-rails ruby ruby-on-rails-4 activerecord

我有一个has_many模型messages message。我想为用户提取所有会话,并向用户显示最后的Conversations_controller预览。我这样做如下:

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

Conversation

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) - >图

DECLARE @x VARCHAR(max) = 'H345678_30'
SELECT SUBSTRING(LEFT(@x, CHARINDEX('_', @x)-1), 4, 10)

所以我必须在此处提取所有消息以对对话进行排序并显示最后一条消息的预览。有没有办法我只能为每次谈话提取最后一条消息,从而提高效率?

1 个答案:

答案 0 :(得分:2)

您可以在Conversation模型中添加关系到其上一条消息:

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

然后在您的搜索中,而不是Conversation.includes(:messages),您执行Conversation.includes(:last_message)