繁体   English   中英

Rails 活动记录按列的总和排序

[英]Rails active record order by sum of a column

所以我有 2 个模型帖子主题

  • 帖子有“查看”的数量。
  • 帖子有一个主题。

在这里,我想获得最多的视图主题并使用 rails 活动记录对其进行排序DESC (所有标记为该主题的帖子的最高总视图)。 这是我正在尝试做的当前代码,但它不正确:-

class Topic < ApplicationRecord
  has_many :posts
  scope :ordered, -> {
    joins(:posts).order("sum(posts.viewed) DESC").limit(2).uniq
  }
end

你需要对你的topics_id进行分组

class Topic < ApplicationRecord
 has_many :posts
 scope :ordered, -> {
 joins(:posts).group("topics.id").order('SUM(posts.viewed) desc').limit(2).uniq
 }
end

这会起作用

对子级求和而不是按总和排序是一种不好的模式。

我建议您在您的 Topic.rb 中添加一个total_views:integer列,并在 post.views 的总和发生变化时更新它。

当子帖子的viewed值增加时,您可以调用回调以自动更新total_views列。

Post.rb 可以有类似的东西:

after_create do
  topic.update_total_views
end
after_update do
  topic.update_total_views
end
after_destroy do
  topic.update_total_views
end

主题.rb:

def update_total_views
  update_column :total_views, (posts.map(&:viewed).sum)
end

比在您的 controller 中,您可以调用Topic.all.order(total_views: :desc)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM