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

Rails active record order by sum of a column

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

这里我要获取浏览量最多的话题并排序DESC(总浏览量最高的 所有标有该主题的帖子)使用 rails 活动记录。这是我目前正在尝试做的代码,但它不正确:-

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

求和 childer 而不是按求和排序是一种糟糕的模式。

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

当childpost的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

Topic.rb:

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

在你的控制器中你可以调用 Topic.all.order(total_views: :desc)

您需要将您的 topics_id

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

这行得通