Rails ActiveRecord: как выбрать лучшие X записей для каждого дня, для нескольких дней в одном запросе? - PullRequest
0 голосов
/ 23 декабря 2019

Модель - «Посты», и в каждом посте есть голоса с повышением: целое число. Сотни постов создаются каждый день, и я хочу вернуть 10 лучших постов за каждый день с одним запросом.

в хронологическом порядке

Я хочу вернуть результаты за прошлый год и показать топ-10 сообщений каждого дня в одном запросе.

ожидаемый результат должен быть:

top10 сообщений за сегодня, 10 лучших сообщений за вчерашний день ... 10 лучших сообщений с самого начала.

есть ли способ выполнить этот запрос без выполнения цикла и индивидуального запроса для каждого дня?

Ответы [ 3 ]

3 голосов
/ 23 декабря 2019

Попробуйте это

Post.where("DATE(created_at) = ?", Date.today).order("upvotes DESC").limit(10)

Здесь Date.today берут сегодняшнюю дату, вы можете передать любую дату, чтобы получить топ-10 на этот конкретный день.

0 голосов
/ 23 декабря 2019

Хорошо, любое из вышеперечисленных решений будет работать отлично, если у вас есть столбец upvotes в вашей таблице posts, однако, если он есть в отдельной таблице, что в идеале должно быть, вам понадобится что-то вроде ниже длято же самое:

query = <<-QUERY
  SELECT posts.*,
  Count(upvotes.*) AS upvotes_count
  FROM   posts
  LEFT JOIN upvotes
        ON upvotes.post_id = posts.id
  WHERE  Date(posts.created_at) = #{Date.today}
  GROUP  BY posts.id
  ORDER  BY upvotes_count DESC
QUERY

ActiveRecord::Base.connection.execute(query).entries

Это с сырым SQL, хотя. Вы можете преобразовать его в ActiveRecord, если вам нужно.

0 голосов
/ 23 декабря 2019

Более точный запрос будет

Post.where("created_at = ?", Date.today.beginning_of_day)
    .order("upvotes DESC").limit(10)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...