Порядок Rails, основанный на ассоциации, не работает должным образом - PullRequest
0 голосов
/ 14 ноября 2018

Я пытаюсь отсортировать фильмы по release_date, но это не работает должным образом

@movies = Movie.where(id: movie_ids).recent

Если я использую противоположную область (: old), она работает, но не с (: недавний)

# Movie.rb

# Associations  
has_many :movie_countries, dependent: :destroy
has_many :countries, through: :movie_countries

# Scopes
scope :recent,    -> { includes(:movie_countries).order('movie_countries.release_date DESC') }
scope :old,       -> { includes(:movie_countries).order('movie_countries.release_date ASC') }

Пример:

MovieCountry id: 1, movie_id: 1, release_date: '2018-01-01'
MovieCountry id: 2, movie_id: 2, release_date: '2019-01-01'
MovieCountry id: 3, movie_id: 3, release_date: '2020-01-01'

movies = Movie.recent
movies => [movie id: 1, movie id: 3, movie id: 2]

movies = Movie.old
movies => [movie id: 1, movie id: 2, movie id: 3]

Как видите, старая область работает правильно, но не: последние

Обратные следы с реальными данными:

  • Последние:

    ВЫБРАТЬ «фильмы». «Id» AS t0_r0, «фильмы». «External_id» AS t0_r1, «фильмы». «Original_title» AS t0_r2, «фильмы». «Original_language»"AS t0_r3," фильмы "." Imdb_id "AS t0_r4," фильмы "." Tmdb_id "AS t0_r5," фильмы "." Rentrak_film_id "AS t0_r6," фильмы "." Running_time "статус AS t0_r7," movies "."«AS t0_r8,« фильмы ».» Веб-сайт «AS t0_r9,« фильмы ».« Фон_урл »AS t0_r10,« фильмы ».« Create_at »AS t0_r11,« фильмы ».« Updated_at »AS t0_r12,« movie_countries ».» Id"AS t1_r0," movie_countries "." Country_id "AS t1_r1," movie_countries "." Movie_id "AS t1_r2," movie_countries "." Release_date "AS t1_r3," movie_countries "." Iso_code "AS t1_r4," movie_countries. "Movie_countries."create_at" AS t1_r5, "movie_countries". "updated_at" AS t1_r6 FROM "movies" LEFT OUTER JOIN "movie_countries" ON "movie_countries". "movie_id" = "movies". "id" WHERE "movies". "id" IN(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 24, 25, $ 26, $ 27, $ 28, $ 29, $ 30, $ 31, $ 32, $ 33, $ 34, $ 35, $ ​​36, $ 37, $ 38, $ 39, $ 40, $ 41, $ 42, $ 43, $ 45, $ 46, $ 47, $ 48, $ 49, $ 50, $ 51, $ 52, $ 53, $ 54, $ 55, $ 56, $ 57, $ 58, $ 59, $ 60, $ 61, $ 62, $ 63, $ 64, $ 65, $ 66, $ 67, 68, $ 69, $ 70, $ 71, 72, $ 73, $ 74, $ 75, $ 76, $ 77, $ 78, $ 79, $ 80, $ 81, $ 82, $ 83, $ 84, $ 85, $ 86, $ 87, $ 88, $ 89, $ 90, $ 91, $ 92, $ 95, $ 96, $ 97, $ 98, $ 99, $ 100, 101, 102, 103, 103, 104, 105, 106, 107, 108, 108, 109, 110, 111, 112, 113, 113, 114, 115, 116, 117, 118, 119, 120, 121, 121, 122, 123, 124, 124, 125, $ 126, $ 127, $ 128, $ 129, $ 130, $ 131, $ 132, $ 133, $ 134, $ 135, $ ​​136, $ 137, $ 138, $ 139, $ 140, $ 141, $ 142, $ 143, $ 144, $ 145, $ 146, $ 147, $ 148, $ 149, $ 150$ 151, $ 152, $ 153, $ 154, $155, 156, 157, 158, 159, 160, 160, 161, 162, 163, 164, 165, 165, 166, 167, 168, 169, 170, 171, 172, 172, 174, 174, 175, 176, 177, 178, 179, 179, 179, 179,$ 180, $ 181, $ 182, $ 183, $ 184, $ 185, $ 186, $ 187, $ 188, $ 189, $ 190, $ 191, $ 192, $ 193, $ 194, $ 195, $ 196, $ 197, $ 198, $ 199, $ 200, $ 201, $ 202, $ 203, $ 204,205 долл. США, 206 долл. США, 207 долл. США, 208 долл. США, 209 долл. США, 211 долл. США, 212 долл. США, 212 долл. США, 214 долл. США, 215 долл. США, 216 долл. США, 218 долл. США, 219 долл. США, 220 долл. США, 221 долл. США, 222 долл. США, 223 долл. США, 224 долл. США, 225 долл. США, 226 долл. США, 226 долл. США, 229 долл. США, 228 долл. США, 229 долл. США, 229 долл. США, 228 долл. США, 229 долл. США, 229 долл. США, 229 долл. США, 229 долл. США, 229 долл. США, 229 долл. США, 229 долл. США, 229 долл. США, долл. США, 229 долл. США, долл. США230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241) ORDER BY movie_countries.release_date DESC

  • Старый:

    ВЫБЕРИТЕ "movies". "Id" AS t0_r0, "movies". "External_id" AS t0_r1, "movies". "Original_title" AS t0_r2, "movies". "Original_language" AS t0_r3, "movies". "Imdb_id" AS t0_r4 , "movies". "tmdb_id" AS t0_r5, "movies". "rentrak_film_id" AS t0_r6, "movies". "running_time" AS t0_r7, "movies". "status" AS t0_r8, "movies". "веб-сайт" AS t0_r9 , "фильмы". "фон_урл", AS t0_r10, "фильмы". "созданный_ат", AS t0_r11, "фильмы". "updated_at", AS t0_r12, "movie_countries". "id", AS t1_r0, "movie_countries". "country_id", AS t1_r1 , "movie_countries". "movie_id" AS t1_r2, "movie_countries". "release_date" AS t1_r3, "movie_countries". "iso_code" AS t1_r4, "movie_countries". "созданный_at" AS t1_r5, "movie_countries". "updated_6" AS FROM "movies" LEFT OUTER JOIN "movie_countries" ON "movie_countries". "Movie_id" = "movies". "Id" WHERE "movies". "Id" IN ($ 1, $ 2, $ 3, $ 4, $ 5, $ 6, $ 7, 8, 9, 10, 11, 12, 13, 14, 14, 15, 16, 17, 18, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 29, 30, 31, 32, 33, 34, 35, 36, 37, 3 8, 39, 40, 41, 42, 43, 44, 44, 45, 46, 47, 48, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 59, 60, 61, 62, 62, 63, 64, 65, 66, 67, 68, 69, 69, 70, 71, 72, 73, 73, 74, 75, 76, 77, 77, 78, 79, 80, 81, 82, 83, 83, 84, 85, 86, 87, 87, 88, 89, 90, 91, 92, 93, 93, 94, 95, 96, 97, 98, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 112, 113, 114, 115, 116, 117, 117, 118, 119, 120, 121, 122, 123, 123, 124, 125, 126, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 135, 136, 137, 138, 139, 140, 140, 141, 142, 143, 144, 145, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 160, 161, 162, 163, 164, 165, 166, 167, 167, 169, 170, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 180, 182, 183, 183, 184, 185, 186, 187, 188, 189, 190, 190, 191, 192, 193, 194, 195, 195, 196, 197, 198, 199, 200, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 212, 213, 214, 2 доллара 15, $ 216, $ 217, $ 218, $ 219, $ 220, $ 221, $ 222, $ 223, $ 224, $ 225, $ 226, $ 227, $ 229, $ 230, $ 231, $ 232, $ 233, $ 234, $ 235, $ ​​236, $ 237, $ 238, $ 239, $ 239, $ 239, $ 239, $ 239, $ 239, $ 239, $ 239, 240 $, 241 $) ЗАКАЗАТЬ от movie_countries.release_date ASC

1 Ответ

0 голосов
/ 14 ноября 2018

Я нашел альтернативу, чтобы решить эту проблему:

# Movie.rb
scope :old,       -> {includes(:movie_countries).order('movie_countries.release_date ASC') }
scope :recent,    -> { old.reverse }

РЕШЕНИЕ

Благодаря ответу @ PavelMikhailyuk Я нашел решение

# Movie.rb
scope :recent,    -> (iso_code = 'FR') { includes(:movie_countries).where(movie_countries: {iso_code: iso_code}).order('movie_countries.release_date DESC') }

Проблема заключалась в том, что в моем фильме было 2 movie_countries.

[#<MovieCountry id: 8, country_id: 2, movie_id: 5, release_date: "2018-12-10", iso_code: "GB", created_at: "2018-10-23 15:23:09", updated_at: "2018-10-23 15:23:09">, 
 #<MovieCountry id: 7, country_id: 1, movie_id: 5, release_date: "2018-10-24", iso_code: "FR", created_at: "2018-10-23 15:23:09", updated_at: "2018-10-23 15:23:09">]

Я должен найти в movie_countries определенную страну И ПОТОМ отсортировать их.

...