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

时间:2018-10-12 18:47:55

标签: ruby-on-rails ruby activerecord

我正在使用名为 simple_hashtag https://github.com/ralovely/simple_hashtag的宝石作为导轨-我试图做的是使用该宝石创建主题标签趋势列表。通过按在过去24小时内创建的等级和顺序列出前15个主题标签。我想推销不再流行的旧标签。 (应该在整个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 :(得分:1)

使用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表是gem的工作方式,它为关系数据库ID分配了唯一的标签。例如,#ootd映射到ID 5,而#sunset映射到8。您可以说:hashtags记录与可能的#标签字符串值之间存在1对1的关系。

gem在:simple_hashtag_hashtaggings表中添加记录,以使用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名为例。