#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. Спасибо. Я, наконец, понимаю это.