Как получить коллекцию записей прародителя из коллекции дочерних записей? - PullRequest
2 голосов
/ 20 апреля 2020

Вот проблема:

  • У меня есть коллекция записей: квитанции. Я хочу получить уникальный список проектов, которые связаны с этими объектами поступления, эффективным способом. Я не смог найти аналогичный вопрос / решение для SO для этого конкретного типа проблемы.

Это то, что я хочу:

@projects = @receipts.getUniqueProjects()
# Project.rb

  has_many :conversations

# Conversation.rb

  has_many :messages
  belongs_to :project

# Message.rb

  has_many :receipts
  belongs_to :conversation

# Receipt.rb

  belongs_to :message

Возможно ли это?

Выглядит многообещающе следующее: но как мне тогда получить доступ к записям великого родителя? Без перебора дочерних записей и огромных накладных расходов базы данных?

Receipt.joins(message: [conversation: :project])

Любые указатели были бы очень благодарны.

Вот что я использовал:

@projects = Project.joins(conversations: {messages: :receipts} ).where(receipts: [1,2,3,4]).uniq

Спасибо Василиса - цените дальновидность, чтобы увидеть, что это была проблема XY.

1 Ответ

2 голосов
/ 20 апреля 2020

Вы можете использовать has_many :through ассоциацию, это полезно для настройки "ярлыков" через вложенные has_many ассоциации.

# Project.rb

  has_many :conversations
  has_many :messages, through: :conversations
  has_many :receipts, through: :messages

# Conversation.rb

  has_many :messages
  belongs_to :project

# Message.rb

  has_many :receipts
  belongs_to :conversation

# Receipt.rb

  belongs_to :message

В этом случае вы можете легко присоединиться к ним и использовать distinct, чтобы получить только уникальные проекты

Project.joins(:receipts).distinct.where(receipts: { id: [1, 2, 3] })
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...