Использование Rails 4.1.6 и Ruby, 2.1.2 и данные следующие три объекта:рельсов 4 сохраняющего порядок соединения объекта при использовании включает в has_many через ассоциацию
class FilmCollection
has_many :film_collection_films, -> { order(:position) }
has_many :films, through: :film_collection_films
end
class FilmCollectionFilm
belongs_to :film_collection_film
belongs_to :film
end
class Film
has_many :film_collection_films
end
FilmCollections являются коллекциями фильмов, и его членов представлены через объект объединения FilmCollectionFilm. FilmCollectionFilm имеет столбец для позиции, так что данный член коллекции может быть переупорядочен (думаю, как очередь фильма), и поэтому нам нужен объект join, а не has_and_belongs_to_many.
Моя проблема возникает, когда я стараюсь загружать фильмы нескольких коллекций сразу.
FilmCollection.first.films
Вызов получит мне запрос, который выглядит следующим образом:
SELECT `film_collections`.* FROM `film_collections`
ORDER BY `film_collections`.`id` ASC LIMIT 1
SELECT `films`.* FROM `films`
INNER JOIN `film_collection_films` ON `films`.`id` = `film_collection_films`.`film_id`
WHERE `film_collection_films`.`extensional_film_collection_id` = 1
ORDER BY `film_collection_films`.`position` ASC
Заказов фильмы правильно на основе положения в соединении объекта.
Но вместо вызова FilmCollection.includes (: фильмы) .first.films получите мне следующий запрос:
SELECT `film_collections`.* FROM `film_collections`
ORDER BY `film_collections`.`id` ASC LIMIT 1
SELECT `film_collection_films`.* FROM `film_collection_films`
WHERE `film_collection_films`.`film_collection_id` IN (1)
ORDER BY `film_collection_films`.`position` ASC
SELECT `films`.* FROM `films` WHERE `films`.`id` IN (1, 16, 53, 185)
который собирает правильные фильмы, но не принимает во внимание порядок во второй части запроса. Как я могу сохранить упорядочение соответствующего объекта соединения при активной загрузке с .includes()
, но все еще не имеет запроса n + 1?
Вместо этого используйте 'joins':' FilmCollection.joins (: films) .first.films'? – Surya
Я действительно нашел решение, которое я собираюсь опубликовать. Это может сработать, но я считаю, что объединение в целом медленнее, чем в любом случае, особенно для больших таблиц. Хотя я мог ошибаться. – BitPuncher
Примечание: Мне кажется, что это ошибка, которая будет исправлена только в Rails 5:/https://github.com/rails/rails/pull/18766 –