【问题标题】: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
【问题讨论】:
标签:
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)