我陷入了困境,在这里是菜鸟。鉴于以下关系。
conversation has_many messages
messages belongs_to conversation
messages has_many documents and vice versa, through document_messages
我需要找到该会话中给定会话ID的所有文档。我可以与以下对象一起工作
c.messages.map(&:documents).select{ |doc| doc.length > 0 }
但是据我了解,它会从数据库中获取所有内容并在应用程序上进行过滤,但是我需要在数据库(where子句?)上对其进行过滤,例如conversation.messages.where(document.exists).map(&:documents)
编辑:我想出了以下有效的SQL查询
SELECT document.id FROM
conversation INNER JOIN message
ON conversation.id = message.c_id
INNER JOIN document_messages
ON message.id = document_messages.m_id
INNER JOIN document
ON document.id = document_messages.d_id
where conversation.id = given_id
答案 0 :(得分:1)
使用方式关联:https://guides.rubyonrails.org/association_basics.html#the-has-many-through-association
Conversation
has_many :messages
has_many :documents, through: :messages
end
Messages
belongs_to :conversation
has_many :documents
end
使用此功能,您可以执行以下操作:
conversation = Conversation.first
conversation.documents
您拥有对话的所有文档!
答案 1 :(得分:1)
因此,我终于设法编写了查询。
Document.joins(document_messages: [{ message: :conversation }]).where(conversations: { id: conversation_id})
可以简化为
Document.joins(messages: :conversation).where(conversations: { id: conversation_id})
答案 2 :(得分:0)
对此连接表如何发挥作用并不完全有信心,但这可能正是您所需要的?
类似的东西:
messages = conversation.messages.includes(:documents)
documents = messages.documents