Как оптимизировать ниже Активный запрос записи, который не возвращает ни одной записи, принадлежащей диапазонам дат - PullRequest
0 голосов
/ 13 февраля 2019

Я бы хотел запрос оптимизированного AR (ActiveRecord), так как мой текущий запрос AR много раз запрашивает БД

Предположим, модель Chocolate со столбцом creation_at .У меня есть следующий запрос AR в моем контроллере:

for i in 1..4 
    @myHash[i] = Chocolate.where(created_at: (Time.now - i.hours)..(Time.now - (i-1).hours)).count    
end

Приведенный выше запрос извлекается из БД 4 раза (при условии, что текущее время 12:00)

Select COUNT(*) from Chocolate where created_at BETWEEN 11:00 AND 12:00
Select COUNT(*) from Chocolate where created_at BETWEEN 10:00 AND 11:00 
Select COUNT(*) from Chocolate where created_at BETWEEN 09:00 AND 10:00 
Select COUNT(*) from Chocolate where created_at BETWEEN 08:00 AND 09:00

Как изменитьзапрос, чтобы он извлекал из БД только один раз?

Ответы [ 2 ]

0 голосов
/ 13 февраля 2019

Попробуйте условие чистой строки:

Chocolate.where('created_at BETWEEN ? AND ?', (Time.now - i.hours), (Time.now - (i-1).hours))
0 голосов
/ 13 февраля 2019

вы можете использовать запрос, подобный следующему:

Chocolate.where(Chocolate.arel_table[:created_at].gteq(4.hours.ago))
         .group("DATE_TRUNC('hour', created_at)")
         .count

Будет возвращен хеш с количеством записей, сгруппированных по часам.

{"2019-02-12 00:00:00"=>152, "2019-02-12 01:00:00"=>57, "2019-02-12 02:00:00"=>132, "2019-02-12 03:00:00"=>132}

Надеюсь, это поможет.

...