包含,选择,排序,限制多个模型(单个查询)

我需要创建一个包含以下表中数据的查询:

*对话 :在用户之间对消息进行分组的模型

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的模型


如何在单个查询中获取以下内容?

  1. (5)来自uniq Conversation 消息的最近消息的限制
  2. 来自ConversationParticipant的 user_id = current_user.id
  3. order seen = false ,然后来自ConversationParticipant的 updated_at DESC
  4. 包括 对话
  5. 包括邮件发件人)=> 用户
  6. 包括来自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}])