Невозможно использовать камень 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 лучших.