包含,选择,排序,限制多个模型(单个查询)
我需要创建一个包含以下表中数据的查询:
*对话 :在用户之间对消息进行分组的模型
class Conversation :conversation_participants ## Attributes title, created_at, updated_at end
* ConversationParticipant :跟踪对话用户的模型
class ConversationParticipant < ActiveRecord::Base ## Associations belongs_to :conversation belongs_to :user ## Attributes conversation_id, user_id, seen, created_at, updated_at end
*消息 :保持跟踪内容和发件人的模型
class Message "User" ## Attributes sender_id, content, conversation_id, created_at, updated_at end
*用户 :具有属性name
的模型
如何在单个查询中获取以下内容?
- (5)来自uniq Conversation 消息的最近消息的限制
- 来自ConversationParticipant的
user_id
= current_user.id- order
seen
=false
,然后来自ConversationParticipant的updated_at DESC
- 包括 对话
- 包括 ( 邮件发件人)=> 用户
- 包括来自ConversationParticipant => User的其他参与者
注意: 包含和选择很重要,因为此问题旨在减少查询数量。
以下是我如何包含所有需要的模型,此查询被转换为5个sql查询,因为preload不加入(在单独的查询中运行)。
Message.joins("LEFT JOIN messages AS m ON messages.id != m.id AND m.conversation_id = messages.conversation_id AND messages.created_at < m.created_at") .where('m.id IS NULL') .joins("INNER JOIN conversation_participants AS cp ON cp.conversation_id = messages.conversation_id AND cp.user_id = #{user_id}") .order("cp.seen, cp.updated_at DESC") .limit(5) .includes(:sender) .includes(conversation: [{conversation_participants: :user}])