Запросы на таблицу ассоциации - PullRequest
0 голосов
/ 19 декабря 2018

Я застрял в проблеме с рельсами, будучи нубом здесь.Учитывая следующие отношения.

conversation has_many messages
messages belongs_to conversation
messages has_many documents and vice versa, through document_messages

Мне нужно найти все документы в этом разговоре для данного идентификатора разговора.Я понял, что работает со следующими

c.messages.map(&:documents).select{ |doc| doc.length > 0 }

Но, насколько я понимаю, он берет все из базы данных и выполняет фильтрацию в приложении, но мне нужно отфильтровать его в базе данных (где предложение?) например, 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 голосов
/ 19 декабря 2018

Не совсем уверен, как это работает с объединяющим столом, но это может быть то, что вам нужно?

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

Что-то вроде:

messages = conversation.messages.includes(:documents)
documents = messages.documents
0 голосов
/ 20 декабря 2018

Итак, мне наконец удалось написать запрос.

Document.joins(document_messages: [{ message: :conversation }]).where(conversations: { id: conversation_id})

, который можно упростить до

 Document.joins(messages: :conversation).where(conversations: { id: conversation_id})
0 голосов
/ 19 декабря 2018

Использование через ассоциацию: 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

И у вас есть все документы разговора!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...