我有一个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)
所以我必须在此处提取所有消息以对对话进行排序并显示最后一条消息的预览。有没有办法我只能为每次谈话提取最后一条消息,从而提高效率?
答案 0 :(得分:2)
您可以在Conversation
模型中添加关系到其上一条消息:
has_one :last_message, -> { order(created_at: :desc) }, source: :message
然后在您的搜索中,而不是Conversation.includes(:messages)
,您执行Conversation.includes(:last_message)