查询关联表

时间:2018-12-19 14:39:06

标签: ruby-on-rails

我陷入了困境,在这里是菜鸟。鉴于以下关系。

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

3 个答案:

答案 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)

对此连接表如何发挥作用并不完全有信心,但这可能正是您所需要的?

https://apidock.com/rails/ActiveRecord/QueryMethods/includes

类似的东西:

messages = conversation.messages.includes(:documents)
documents = messages.documents