我正在使用名为 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)
答案 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
记录。您可以说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名为例。