ActiveRecord: загрузить только одну ассоциацию из has_many на основе родительской записи

avatar
fydelio
8 августа 2021 в 19:19
26
1
0

У меня есть модель Item, имеющая Category, присвоенная Location и имеющая Responsible (необязательно).

enter image description here

Затем на Category вы также можете определить несколько default_responsibles.

  • Общий, если не указано местоположение
  • Один для определенного местоположения (и который имеет приоритет над общим).
    Идея здесь в том, что если в элементе не указан ответственный, он автоматически извлекает правильное из категории.

Итак, вот задача. На странице индекса, где я отображаю все элементы, включая ответственных, как мне сделать эффективный запрос, правильно загрузив / предварительно загрузив правильный ответственный (тот, который соответствует местоположению, или, если он отсутствует, - общий) в категории?

Используемая база данных: Postgresql

Источник
June7
9 августа 2021 в 01:03
0

Добавьте тег для платформы базы данных.

Ответы (1)

avatar
B Seven
9 августа 2021 в 02:41
0

Вы не указали код своей модели, но я думаю, вы можете сделать что-то вроде:

class Item
  has_one :responsible
  has_one :default_responsible, through: :category

Контроллер:

  def index
    @items = Item.all.includes(:responsible).includes(category: :default_responsible)

https://edgeguides.rubyonrails.org/active_record_querying.html#nested-associations-hash

fydelio
9 августа 2021 в 05:07
0

Если вы посмотрите на изображение, вы увидите код модели. Проблема заключается в том, как выбрать правильного ответственного по умолчанию на основе местоположения элемента, если категория может иметь несколько default_responsible (следовательно, для каждого местоположения по-разному)