![](/img/trans.png)
[英]Rails order active record results based on one column and another if null
[英]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.