Я работаю над учебным проектом по созданию короткого URL.
У меня есть следующие классы / таблицы:
shortened_urls
, который содержит короткий URL, длинный URL и user. user
, в котором хранится информация о пользователе. visit
, которая представляет собой таблицу соединений для тех, кто посещал какие ссылки. tag_topics
содержит категории для пометки URL-адресов. tagging
- это таблица соединений, которая связывает сокращенные URL-адреса с тегом.
Я пытаюсь
"напишите метод TagTopic#popular_links
, который возвращает 5 самых посещаемых ссылок для этого TagTopi c вместе с числом нажатий на каждую ссылку."
Я начал с:
def popular_links
shortened_urls.joins(:visits)
end
, который дал следующий вывод в теге videos. Например:
ShortenedUrl Load (0.8ms) SELECT "shortened_urls".* FROM "shortened_urls" INNER JOIN "taggings" ON "shortened_urls"."id" = "taggings"."shortened_url_id" INNER JOIN "visits" ON "visits"."shortened_url_id" = "shortened_urls"."id" WHERE "taggings"."tag_topic_id" = $1 [["tag_topic_id", 2]]
[#<ShortenedUrl:0x00007fc7caee5298
id: 2,
short_url: "G6hSOkznliIwHxMUV1BPug",
long_url: "imdb.com",
user_id: 2,
created_at: Wed, 18 Mar 2020 21:07:36 UTC +00:00,
updated_at: Wed, 18 Mar 2020 21:07:36 UTC +00:00>,
#<ShortenedUrl:0x00007fc7cbd04e00
id: 3,
short_url: "kFf-yYHHUZZFBYEy__K9sw",
long_url: "youtube.com",
user_id: 3,
created_at: Wed, 18 Mar 2020 21:07:36 UTC +00:00,
updated_at: Wed, 18 Mar 2020 21:07:36 UTC +00:00>,
#<ShortenedUrl:0x00007fc7cbd04ba8
id: 3,
short_url: "kFf-yYHHUZZFBYEy__K9sw",
long_url: "youtube.com",
user_id: 3,
created_at: Wed, 18 Mar 2020 21:07:36 UTC +00:00,
updated_at: Wed, 18 Mar 2020 21:07:36 UTC +00:00>,
#<ShortenedUrl:0x00007fc7cbd04928
id: 3,
short_url: "kFf-yYHHUZZFBYEy__K9sw",
long_url: "youtube.com",
user_id: 3,
created_at: Wed, 18 Mar 2020 21:07:36 UTC +00:00,
updated_at: Wed, 18 Mar 2020 21:07:36 UTC +00:00>,
#<ShortenedUrl:0x00007fc7cbd04798
id: 3,
short_url: "kFf-yYHHUZZFBYEy__K9sw",
long_url: "youtube.com",
user_id: 3,
created_at: Wed, 18 Mar 2020 21:07:36 UTC +00:00,
updated_at: Wed, 18 Mar 2020 21:07:36 UTC +00:00>,
#<ShortenedUrl:0x00007fc7cbd045b8
id: 4,
short_url: "DZa0WvFrMcRjL2EQAFdWyg",
long_url: "plex.tv",
user_id: 3,
created_at: Wed, 18 Mar 2020 21:07:36 UTC +00:00,
updated_at: Wed, 18 Mar 2020 21:07:36 UTC +00:00>]
Но когда я пытаюсь сделать какой-либо выбор или подсчет (это было изначально предоставленное решение):
def popular_links
shortened_urls.joins(:visits)
.group(:short_url, :long_url)
.order('COUNT(visits.id) DESC')
.select('long_url, short_url, COUNT(visits.id) as number_of_visits')
.limit(5)
end
Я получаю следующий вывод:
ShortenedUrl Load (2.1ms) SELECT long_url, short_url, COUNT(visits.id) as number_of_visits FROM "shortened_urls" INNER JOIN "taggings" ON "shortened_urls"."id" = "taggings"."shortened_url_id" INNER JOIN "visits" ON "visits"."shortened_url_id" = "shortened_urls"."id" WHERE "taggings"."tag_topic_id" = $1 GROUP BY "shortened_urls"."short_url", "shortened_urls"."long_url" ORDER BY COUNT(visits.id) DESC LIMIT $2 [["tag_topic_id", 2], ["LIMIT", 5]]
[#<ShortenedUrl:0x00007fc7d21431c8
id: nil,
short_url: "kFf-yYHHUZZFBYEy__K9sw",
long_url: "youtube.com">,
#<ShortenedUrl:0x00007fc7d20ebd38
id: nil,
short_url: "DZa0WvFrMcRjL2EQAFdWyg",
long_url: "plex.tv">,
#<ShortenedUrl:0x00007fc7d20ebc48
id: nil,
short_url: "G6hSOkznliIwHxMUV1BPug",
long_url: "imdb.com">]
Здесь нет "count", и id равен нулю. URL будут выбирать, хотя. Я попытался изменить аранжировку или сделать другой выбор, но он никогда не возвращал счет. Посмотрев на select all
в таблице соединений, он сможет рассчитывать. Я не уверен, правильно ли я спрашиваю или что.