Как упорядочить записи сначала по created_at за последние 3 дня, а затем по другому столбцу, используя rails [Postgresql]

Используя Active Record, как упорядочить по 2 столбцам (created_at, views):

1-й: записи, созданные за последние 3 дня

2-й: все после этого надо упорядочивать только по просмотрам

Чтобы получить результат, подобный этому (не обращайте внимания на синтаксис даты):

[[2017-02-15 00:00:00 UTC, 150]],
 [2017-02-14 00:00:00 UTC, 88],
 [2017-02-13 00:00:00 UTC, 12]],
 [2016-01-14 00:00:00 UTC, 99999]],
 [2016-03-10 00:00:00 UTC, 3000]],
 [2016-11-07 00:00:00 UTC, 2000]],
 [2016-10-21 00:00:00 UTC, 1000]],
 [2016-09-03 00:00:00 UTC, 100]],
 [2016-05-18 00:00:00 UTC, 10]]

Я нашел «date_trunc» в Postgresql, но мне нужны последние 3 дня только один раз, а затем просто учитывать количество просмотров.

Какие варианты у меня есть, в идеале, используя только один запрос?

Спасибо




Ответы (2)


Вот ответ, может быть не один запрос. Но это соответствует вашему требованию.

Я беру модель User в качестве примера.

Во-первых, получите пользователей, чья дата создания приходится на последние 3 дня.

users = User.where(:created_at => (Date.today - 3.days)..Date.today)

Теперь отсортируйте пользователей, чья дата создания не относится к последним 3 дням, по просмотрам DESC

users2 = (User.where.not(:created_at => (Date.today - 3.days)..Date.today)).order('views desc')

Теперь объединив два результата с помощью (+)

Объекты Rails Active Record можно объединять с помощью (+)

users3 = users + users2 дает ваш результат.

person Sravan    schedule 16.02.2017
comment
Спасибо Шраван, это работает. Я все еще ищу решение для одного запроса. - person Simon; 16.02.2017
comment
да, я тоже буду пробовать. Вы можете принять его, если сочтете его полезным. - person Sravan; 16.02.2017
comment
Я почти уверен, что это невозможно сделать в одном запросе. Я бы согласился с ответом, данным @Sravan - person Dan; 16.02.2017

Вы можете указать дату создания между текущей датой и текущей датой - 3 дня. Здесь вы получите все записи, которые были созданы за последние 3 дня.

current_date = Time.zone.now
before_date = current_date - 3.days

Ex: where(:created_at => before_date.beginning_of_day.. current_date.end_of_day).order(created_at ASC, views DESC)
person krishonrails    schedule 16.02.2017
comment
Спасибо, но это только последние 3 дня. Должны быть показаны все записи, причем записи, созданные за последние 3 дня, должны быть вверху. - person Simon; 16.02.2017