Ruby on Rails эффективно перебирает столбцы - PullRequest
0 голосов
/ 08 ноября 2019
            created_at            iteration   group_hits_per_iteration
--------------------------------------------------------------------
    2019-11-08 08:14:05.170492      300                    34
    2019-11-08 08:14:05.183277      300                    24
    2019-11-08 08:14:05.196785      300                    63
    2019-11-08 08:14:05.333424      300                    22
    2019-11-08 08:14:05.549140      300                    1
    2019-11-08 08:14:05.576509      300                    15
    2019-11-08 08:44:05.832730      301                    69
    2019-11-08 08:44:05.850111      301                    56
    2019-11-08 08:44:05.866771      301                    18
    2019-11-08 08:44:06.310749      301                    14

Здравствуйте. Моя цель - создать итоговую сумму значений в «group_hits_per_iteration» для каждого уникального значения в «столбце итерации», которая затем будет отображена с помощью chartkick.

Например, дляитерация 300 Я бы суммировал 34,24,63,22,1,15 на общую сумму 159, а затем повторял бы для каждой уникальной записи.

Код, который я включил ниже, работает и генерирует требуемый результатно это медленно и становится медленнее, чем больше данных считывается в базу данных.

Он создает хеш, который подается в чарткик.

hsh = {}
Group.pluck(:iteration).uniq.each do |x|

date = Group.where("iteration = #{x}").pluck(:created_at).first.localtime
itsum = Group.where("iteration = #{x}").pluck('SUM(group_hits_per_iteration)' )
hsh[date] = itsum
end





<%= line_chart [
  {name: "#{@groupdata1.first.networkid}", data: hsh}

] %>

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

Спасибо за помощь.

1 Ответ

0 голосов
/ 08 ноября 2019

Если вы хотите получать только суммы для каждой итерации, следующий код должен работать:

# new lines only for readability
group_totals =
  Group
    .select('iteration, min(created_at) AS created_at, sum(group_hits_per_iteration) AS hits')
    .group('iteration')
    .order('iteration') # I suppose you want the results in some order

group_totals.each do |group|
  group.iteration # => 300
  group.hits # => 159
  group.created_at # => 2019-11-08 08:14:05.170492
end

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

Примечание. В своем коде вы берете первые created_at для каждой итерации, я выбрал самую низкую дату

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...