Как ранжировать хэштеги, которые были созданы за последние 24 часа и имеют самый высокий счет?Простые хэштеговые рельсы - PullRequest
0 голосов
/ 12 октября 2018

Я использую гем под названием simple_hashtag https://github.com/ralovely/simple_hashtag для рельсов. Я пытаюсь создать список трендов хештега с использованием этого гема.Перечисляя 15 лучших хэштегов по рангу и порядку, созданным за последние 24 часа.Я хотел бы отбросить старые хэштеги, которые больше не популярны.(что должно происходить в течение 24-часового жизненного цикла)

def trending_hashtags
    @whats_trending_hashtags = SimpleHashtag::Hashtag.where('created_at > ?', 24.hours.ago).order('count(hashtags.hashtaggable_id) desc')
end

ОБНОВЛЕНИЕ: я отредактировал свой код в соответствии с примером AJCodez.То, что я пока ниже, вызывает небольшие ошибки.Одним из них является двусмысленность для SimpleHashtag::Hashtagging.where("created_at >") части утверждения и group("hashtags.id").order части утверждения.Я добавил отметку времени в таблицу simple_hashtag_hashtaggings .

 @whats_trending_hashtags = SimpleHashtag::Hashtag.left_joins(:hashtaggings).merge(SimpleHashtag::Hashtagging.where("created_at > ?", 24.hours.ago)).group('hashtags.id').order("COUNT(*) DESC").limit(20)

Консоль IRB ниже:

irb(main):022:0>>> SimpleHashtag::Hashtag.left_joins(:hashtaggings).merge(SimpleHashtag::Hashtagging.where("created_at > ?", 24.hours.ago)).group('hashtags.id').order("COUNT(*) DESC").limit(20)
 SimpleHashtag::Hashtag.left_joins(:hashtaggings).merge(Sim
<tag::Hashtag.left_joins(:hashtaggings).merge(SimpleHashtag::Hashtagging.w
<ashtaggings).merge(SimpleHashtag::Hashtagging.where("created_at > ?", 24.
<ashtag::Hashtagging.where("created_at > ?", 24.hours.ago)).group('hashtag
<"created_at > ?", 24.hours.ago)).group('hashtags.id').order("COUNT(*) DES
<.ago)).group('hashtags.id').order("COUNT(*) DESC").limit(20)
DEPRECATION WARNING: Dangerous query method (method whose arguments are used as
raw SQL) called with non-attribute argument(s): "COUNT(*) DESC". Non-attribute a
rguments will be disallowed in Rails 6.0. This method should not be called with
user-provided values, such as request parameters or model attributes. Known-safe
 values can be passed by wrapping them in Arel.sql(). (called from irb_binding a
t (irb):22)
  SimpleHashtag::Hashtag Load (0.0ms)  SELECT  "simple_hashtag_hashtags".* FROM
ActiveRecord::StatementInvalid: PG::AmbiguousColumn: ERROR:  column reference "c
"simple_hashtag_hashtags" LEFT OUTER JOIN "simple_hashtag_hashtaggings" ON "simp
le_hashtag_hashtaggings"."hashtag_id" = "simple_hashtag_hashtags"."id" WHERE (cr
reated_at" is ambiguous
eated_at > '2018-10-11 21:57:11.204021') GROUP BY hashtags.id ORDER BY COUNT(*)
DESC LIMIT $1  [["LIMIT", 11]]
LINE 1: ...shtag_id" = "simple_hashtag_hashtags"."id" WHERE (created_at...
                                                             ^
: SELECT  "simple_hashtag_hashtags".* FROM "simple_hashtag_hashtags" LEFT OUTER

ОБНОВЛЕНИЕ 2: я изменил инструкциюк тому, что ниже.Я получаю ошибку по-прежнему для неопределенности, но он возвращает пустой массив.Это означает, что он работает правильно, я думаю.

SimpleHashtag::Hashtag.left_joins(:hashtaggings).merge(SimpleHashtag::Hashtagging.where("simple_hashtag_hashtaggings.created_at > ?", 24.hours.ago)).group('simple_hashtag_hashtags.id').order("COUNT(*) DESC").limit(20) 

1 Ответ

0 голосов
/ 12 октября 2018

Невозможно использовать камень simple_hashtag.Это может работать только в том случае, если вы добавили миграцию базы данных, чтобы добавить метки времени в таблицу :simple_hashtag_hashtaggings.


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

create_table :simple_hashtag_hashtags do |t|
  t.string :name,             :index => true
  t.timestamps
end

create_table :simple_hashtag_hashtaggings do |t|
  t.references :hashtag,      :index => true
  t.references :hashtaggable, :polymorphic => true
end

Вы можете видеть, что таблица :hashtags имеет временные метки, а :hastaggings не имеет временных меток.

Как работает гем - таблица :simple_hashtag_hashtags назначает уникальные хэштеги для идентификатора реляционной базы данных.Так #ootd отображается на ID 5, а #sunset отображается на 8, например.Можно сказать, что между записями :hashtags и возможными значениями строки хэштега есть отношение 1 к 1.

В таблицу :simple_hashtag_hashtaggings гем добавляет записи, чтобы объединить идентификатор хэштега с любой моделью, использующей записи Hashtagging.Таким образом, сообщения с тремя хэштегами будут иметь три Hashtagging записи.Можно сказать, что между записями от Hashtag и Hashtaggable до Hashtaggings существует много-много связей.

Если вам нужны самые популярные хэштеги за последние 24 часа, если у вас есть метки времени в таблице :hashtaggings, вы можете рассчитать их путем группировки, подсчета и упорядочения.

В конце запросавыглядит следующим образом:

Hashtag.left_joins(:hashtaggings).merge(Hashtagging.where("created_at > ?", 24.hours.ago)).group('hashtags.id').order("COUNT(*) DESC").limit(20)
  • Начните с Hashtag, потому что вы хотите хэштеги.
  • left_joins, потому что вы хотите, чтобы LEFT OUTER JOIN разрешал хэштеги с нулевым числом связанных хэштегов в период времени.Если вы хотите исключить нулевое число хэштегов, используйте joins.
  • merge() используется для добавления условий в таблицу соединений.
  • created > ? используется, чтобы ограничить хэш-теги продолжительностью 24 часа.
  • group('hashtags.id').order('COUNT(*) DESC') используется для группировки хэш-тегов по самому хэш-тегу и подсчета, сколько раз это происходит.
  • limit(20) используется, например, для 20 лучших.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...