Rails 3 ActiveRecord сумма модели для каждой связанной модели - PullRequest
2 голосов
/ 14 июля 2011

у меня 2 модели

Category
- id
- name

и

Transaction
 - id
 - category_id
 - amount

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

Есть ли способ сделать все это одним запросом?

Редактировать: Я хочу закончить со списком [[category1, sum], [category2, sum]].

Ответы [ 2 ]

8 голосов
/ 14 июля 2011
Transaction.group(:category_id).sum(:amount)

Это вернет хеш, подобный этому:

{CATEGORY_ID => SUM_OF_TRANSACTIONS, ....}

или

{1 => 100.0, 2 => 350.0, etc.}

Чтобы получить настоящие Category имена:

Transaction.includes(:category).group("categories.name").sum(:amount)
# => {"Category1" => 100.0, ...}
0 голосов
/ 14 июля 2011
@category.transactions.sum(:amount)

UPD 1

Вы можете поделиться какой-нибудь работой с Ruby:

Category.includes(:transactions).map{|c| [c.name, c.transactions.inject(0){|sum, t| sum += t.amount}]}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...