Eagerload has_one связан с таблицей, имеющей несколько связанных значений - PullRequest
0 голосов
/ 20 января 2019

Итак, у меня определены следующие модели:

class Album
  has_many :photos
  has_one :cover_photo, class_name: "Photo"
end

class Photo
  belongs_to :photo
end

Теперь я хочу загрузить ассоциацию cover_photo при загрузке альбомов следующим образом:

Album.where(...).includes(:cover_photo)

Но согласно документации ActiveRecord и наблюдаемому поведению, limit (это то, что определяет ассоциация has_one), не соблюдается. Итак, я получаю следующий запрос:

Photo Load (1.0ms)  SELECT "photos".* FROM "photos" WHERE "photos"."album_id" IN (5, 4, 2, 1)

Хотя album.cover_photo теперь возвращает один объект без запуска дополнительных запросов, очевидно, что ВСЕ фотографии загружаются из базы данных, а это не то, что я хочу.

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

1 Ответ

0 голосов
/ 21 января 2019

Эта статья точно отвечает на мой вопрос, а также на другой мой вопрос о том, как я могу вручную предварительно загрузить записи в ассоциацию AR - https://mrbrdo.wordpress.com/2013/09/25/manually-preloading-associations-in-rails-using-custom-scopessql/

Соответствующий код с должности:

class Album < ActiveRecord::Base
  has_many :photos
  has_one :display_photo, -> {
    self.select_values = ["DISTINCT ON(photos.album_id) photos.*"]
    order('photos.album_id')
    }, class_name: "Photo"
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...