Rails 活动记录按列的总和排序
Rails active record order by sum of a column
所以我有 2 个模型 帖子 和 主题
- 帖子数 "viewed"。
- 帖子有主题。
这里我要获取浏览量最多的话题并排序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
这行得通
所以我有 2 个模型 帖子 和 主题
- 帖子数 "viewed"。
- 帖子有主题。
这里我要获取浏览量最多的话题并排序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
这行得通