1

我使用此实例查找更多视图 5 项,但无法获得结果。
能教我怎么弄吗?

 @test = Item.limit(5).joins(:impressions).group("impressions.impressionable_id").order("count(impressions.impressionable_id) DESC")
4

3 回答 3

1

在您的 CreatePosts 迁移中:

t.integer :visits, default: 0

在您的 post.rb 中:

is_impressionable counter_cache: true, column_name: :visits, :unique => :all

然后:

Post.order(visits: :asc).limit(5)

这个东西仍然适用于在你的帖子中渲染计数(Slim):

= post.impressionist_count

是的,这在 PostreSQL 中有效,并且对 activeadmin 没有问题(对于仪表板来说非常方便)希望它有所帮助。

于 2016-06-18T14:09:41.707 回答
0

可以使用计数器缓存来实现。在这种方法中,您必须为您的模型创建一个新列并向您model的模型添加一些配置。因此,gem 会自动更新查看次数。

或者,(未测试,但应该可以)

Item.joins(:impressions).group("impressions.impressionable_id").order("count(impression‌​s.id) DESC").first(5)
于 2016-06-18T06:18:55.660 回答
0

如果您使用的是 PostgreSQL,Emu 给出的答案将不起作用。请参阅此处了解说明。

ActiveRecord::StatementInvalid: PG::GroupingError: ERROR: column "items.id" 必须出现在 GROUP BY 子句中或在聚合函数中使用

只需添加表的主键列,Item一切都应该工作!

Item.joins(:impressions).
     group("items.id, impressions.impressionable_id").
     order("count(impression‌​s.id) DESC").
     first(5)
于 2016-06-18T07:15:09.953 回答