Rails порядок активных записей по сумме столбца - PullRequest
1 голос
/ 26 мая 2020

Итак, у меня есть 2 модели сообщения и темы

  • Посты имеют количество "просмотренных".
  • Посты имеет топи c.

Здесь я хочу получить наибольшее количество просмотров тем и упорядочить их DESC (наибольшее общее количество просмотров всех сообщений, отмеченных этим топи c), используя активную запись rails. Вот мой текущий код того, что я пытаюсь сделать, но он неверен: -

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

Ответы [ 2 ]

2 голосов
/ 26 мая 2020

Вам нужно сгруппировать свои темы_id

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

Это сработает

0 голосов
/ 26 мая 2020

Суммировать потомство, а затем упорядочивать по сумме - плохая практика.

Я бы посоветовал вам добавить столбец total_views:integer в свой Topi c .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

Topi c .rb:

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

Чем в вашем контроллере вы можете позвонить Topic.all.order(total_views: :desc)

...