【问题标题】:Rails active record order by sum of a columnRails 活动记录按列的总和排序
【发布时间】:2020-05-26 10:02:23
【问题描述】:

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

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

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

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

【问题讨论】:

  • 您可能需要按posts.id 或类似的方式分组。

标签: sql ruby-on-rails ruby activerecord


【解决方案1】:

你需要对你的topics_id进行分组

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

这样就可以了

【讨论】:

    【解决方案2】:

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

    我建议您将 total_views:integer 列添加到您的 Topic.rb 并在 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
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-07
      • 1970-01-01
      • 2012-04-15
      相关资源
      最近更新 更多