Как использовать расширенный запрос без вывода nil при выборе счетчика в Rails - PullRequest
0 голосов
/ 20 марта 2020

Я работаю над учебным проектом по созданию короткого 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 в таблице соединений, он сможет рассчитывать. Я не уверен, правильно ли я спрашиваю или что.

1 Ответ

2 голосов
/ 20 марта 2020

Нет "счетчика"

На самом деле вы видите, что происходит при проверке модели, а не фактические строки результатов из базы данных. Он будет отображать только те атрибуты модели, которые созданы путем чтения схемы базы данных. Это всего лишь средство отладки.

Если вы действительно выполняете итерацию, хотя записи атрибута на самом деле есть.

popular_links.each do |url|
  puts url.number_of_visits
end

Protip - это написание модульных тестов, а не просто слепой взгляд на консоль.

и идентификатор отображается как ноль.

Это потому, что вы не выбираете идентификатор.

.select(:id, :long_url, :short_url, 'COUNT(visits.id) as number_of_visits')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...