使用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有一个位置列,以便集合中的给定成员可以重新排序(像电影队列一样),因此我们为什么需要连接对象而不是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 2014-12-11 07:48:27
我确实找到了即将发布的解决方案。这可能会起作用,但我认为加入总体上比总体速度要慢,特别是对于大型表格。虽然我可能是错的。 – BitPuncher 2014-12-12 01:08:38
注意:在我看来,这是一个只能在Rails 5中修复的bug:/ https://github.com/rails/rails/pull/18766 – 2017-04-04 16:11:39