Построение алгоритма трендов, основанного на количестве постов и частоте - PullRequest
0 голосов
/ 12 июня 2019

Скажите, у меня есть модель платы. Доски имеют много постов. Я просто хочу найти форумы с наибольшим количеством сообщений в течение (х) дней. Ниже мой чрезвычайно наивный подход к этому. С предоставленным кодом я получаю ошибку:

ActiveRecord::StatementInvalid (PG::UndefinedTable: ERROR:  missing FROM-clause entry for table "posts")
LINE 1: SELECT  "boards".* FROM "boards" WHERE (board.posts.created_...
                                                ^
: SELECT  "boards".* FROM "boards" WHERE (board.posts.created_at >= '2019-06-05 12:14:30.661233') LIMIT $1

Пожалуйста, дайте мне знать, если есть лучший способ сделать это, кроме ошибки, которую я получаю.

class Board < ApplicationRecord
  has_many :posts

  scope :trending, -> { includes(:posts).where('board.posts.created_at >= ?', Time.now-7.days).order(posts_count: :desc) }
end

class Post < ApplicationRecord
  belongs_to :board, counter_cache: true
end

Обновление: Поэтому мне удалось придумать рабочую область, но не уверен на 100%, является ли она наиболее оптимальной. Ваши мысли будут оценены:

scope :trending, -> { includes(:posts).where(posts: { created_at: Time.now - 7.days }).order(posts_count: :desc) }

1 Ответ

1 голос
/ 12 июня 2019

Обновление:

Board.joins(:posts)
     .select("boards.*, count(posts.id) as latest_posts_count")
     .where('posts.created_at >= ?', 7.days.ago)
     .order('latest_posts_count desc')
     .group('boards.id')

Попробуйте, вам нужно присоединиться к нему и сгруппировать их по board_id

Board.joins(:posts)
     .select("boards.*, count(posts.id) as posts_count")
     .where('posts.created_at >= ?', 7.days.ago)
     .order('posts_count desc')
     .group('boards.id')

Объяснение:

  • Мы объединили (внутреннее объединение) таблицы, поэтому по умолчанию вы получаете только доски, с которыми связан хотя бы один пост
  • , мы заказали их по количеству постов
  • , сгруппировали их по доскам.id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...