如何对过去 24 小时内创建并具有最高计数的主题标签进行排名?简单的标签轨道



我正在使用一个名为simple_hashtaghttps://github.com/ralovely/simple_hashtag 的 gem for rails - 我正在尝试做的是使用 gem 创建一个主题标签趋势列表。通过列出过去 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) 

使用simple_hashtaggem 是不可能的。仅当您添加数据库迁移以向: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表没有时间戳。

Gem 的工作原理是:simple_hashtag_hashtags表将唯一的主题标签分配给关系数据库 ID。例如,#ootd映射到 ID5#sunset映射到8。您可以说:hashtags记录和可能的主题标签字符串值之间存在 1 比 1 的关系。

:simple_hashtag_hashtaggings表中,Gem 添加记录以使用Hashtagging记录将主题标签 ID 与任何模型联接。因此,具有三个主题标签的帖子将有三个相关的Hashtagging记录。你可以说HashtagHashtaggable记录之间有很多对多的关系,通过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 名为例。

最新更新