Что я должен сделать для получения итога? Используйте активную модель (Rails)

#ruby-on-rails

#ruby-on-rails

Вопрос:

Я хотел бы получить статистику по каждой компании. Возможно ли разделение каждого месяца и подведение итогов? С другой стороны, требуется ли функция?

 ResultModel  
    company_id , count , date
    1,3,2014-01-06 06:14:03  0000
    1,3,2014-01-08 16:14:03  0000
    1,3,2014-02-06 07:05:03  0000
    1,3,2014-03-06 36:14:04  0000
    1,3,2014-03-06 26:12:05  0000
    1,3,2014-03-06 06:23:05  0000
    2,3,2014-03-06 06:23:05  0000



Result
company_id , month , total
1 , 201401 , 2
1 , 201402 , 1
1 , 201403 , 3
  

Ответ №1:

Столбец псевдонимов

Одним из способов добиться этого было бы использование alias столбца, как описано в этом Railscast (06:30):

введите описание изображения здесь

Вы могли бы сделать что-то вроде этого:

 #app/models/result.rb
Class Result < ActiveRecord::Base
   has_many :more_results, -> { select("#{Result.table_name}.*, #{ResultModel.table_name}.month AS new_month")}
end
  

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

Определение:

Псевдоним — это функция SQL, которая поддерживается большинством, если не всеми, системами управления реляционными базами данных (RDBMS). Псевдонимы предоставляют администраторам баз данных, а также другим пользователям базы данных, возможность уменьшить объем кода, необходимого для запроса, и сделать запросы в целом более простыми для понимания. Кроме того, псевдонимы могут использоваться как метод обфускации для защиты реальных имен полей базы данных.

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


Подсчитайте

Я не уверен, что вы имеете в виду, говоря «посчитать количество месяцев», но я знаю, что вы можете включить COUNT такой метод, как этот:

 #app/models/result.rb
Class Result < ActiveRecord::Base
   has_many :more_results, -> { select("#{Result.table_name}.*, count(#{ResultModel.table_name}.month) AS total")}
end
  

Комментарии:

1. Спасибо. Я, наконец, понимаю это.