#ruby-on-rails-3
#ruby-on-rails-3
Вопрос:
У меня есть модель платежей, в которой хранятся payment_date и сумма. Я хочу получать общую сумму платежей, производимых каждый месяц за последний год.
Я начал с получения всех платежей, произведенных за последние 12 месяцев. Теперь, как я могу сгруппировать их для каждого месяца и получить общую сумму за месяц. Мне просто нужны следующие два поля в результирующем наборе: «месяц и год» и «total_amount». Мне нужны эти данные для построения графика ежемесячных расходов.
Я использую rails 3.
Ответ №1:
Обновить
Следующий запрос возвращает сгруппированные Payment
объекты, поэтому вам нужно будет извлечь нужные вам поля, что-то вроде этого:
@payments = Payment.select("SUM(amount) as total_payment, MONTH(payment_date) as month, YEAR(payment_date) as year").group("MONTH(payment_date), YEAR(payment_date)")
@data = @payments.map {|payment| [payment.amount, payment.month, payment.year]}
а затем извлеките нужные вам значения.
Комментарии:
1. спасибо, что помогли мне начать, но я не могу получить доступ к результирующему набору (для 2-го запроса). Возвращает [#<Платеж>, #<Платеж>, #<Оплата>]. Вероятно, проблема с «выбрать как» связана с тем, что новые атрибуты недоступны в модели. Приведенное выше использование в rails 3 устарело, и я попытался реконструировать запрос как: Payment.select(«SUM (сумма) как total_payment, MONTH (payment_date) как month, YEAR (payment_date) как year»).group(«MONTH (payment_date), YEAR (payment_date)») , но с набором результатов все та же проблема.
2. A to_sql к приведенному выше запросу вернул следующий sql-запрос: ВЫБЕРИТЕ SUM (сумма) в качестве total_payment, MONTH (payment_date) в качестве month, YEAR (payment_date) в качестве year ИЗ
payments
GROUP BY MONTH (payment_date), YEAR (payment_date); Выполнение его напрямую дает мне правильный результат. Я считаю, что запрос ActiveRecord правильный, но почему-то я не могу получить доступ к результатам.3. Я думаю, вам придется сопоставить нужные вам атрибуты с массивом (см. Мое обновление).
4. Вторая инструкция завершается ошибкой со следующим исключением: NoMethodError: неопределенный метод `map’ для #<Payment> Я думаю, что мы чего-то не хватает. Я попробовал Payment.sum(:amount), который вернул сумму, но Payment.select(‘SUM(сумма) как сумма’) выдает аналогичный набор результатов ([#<Оплата>]), как описано выше. Payment.select(‘сумма’) также возвращает требуемый результат. Это что-то с ‘select as’. Возможно, модель ActiveRecord не генерирует для них средства доступа к атрибутам.
5. попробуйте
@data = @payments.map {|payment| [payment.payment_date, payment.amount]}