2013-10-02 2 views
0

Я пытаюсь создать отчет на экране истории транзакций учета. В большинстве ситуаций это одна строка отображения на запись в таблице AccountingTransaction. Но иногда есть транзакции, которые я хочу показать конечному пользователю как одну транзакцию, которая действительно за кулисами, две учетные транзакции. Это вызвано отсрочкой доходов и расторжением фонда, поскольку это приложение является приложением для учета средств.Отчет с использованием группы Rails ActiveRecord по

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

У меня есть запрос теперь использует группу по группе соответствующих сделок

@history = AccountingTransaction.where("customer_id in (?) AND no_download <> 1", customers_in_account).group(:transaction_type_id, :reference_id).order(:created_at) 

как я Переберите я получаю транзакции, сгруппированных, как я хочу, но я борюсь с тем, как вывести общую сумму из ' кредитное поле для всех записей в группе. (Он показывает только первую запись группы). Если я добавлю .sum(:credit) к моему запросу, он, конечно же, вернет суммы, как я хочу, но не все остальные данные.

Есть ли способ для меня сгруппировать эти записи, как в моем @history запросе, а также получить сумму кредитного поля для каждой соответствующей группы?

* Добавление * То, что я действительно хочу, это то, что следующий SQL запрос будет дать мне.

SELECT transaction_type_id, reference_id, sum(credit) 
WHERE customer_id in (21,22,23,24) AND no_download <> 1 
GROUP BY reference_id, transaction_type_id ORDER BY created_at 
+0

Я уверен, что вы могли бы использовать Arel, как вышеписанные этот пост: http://stackoverflow.com/questions/5972336/how-to-sum-a-grouped -column-in-arel – Magnuss

+0

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

ответ

1

Я не уверен, что вы можете сделать «ORDER BY created_at» и не включать его в поля выбора, но вот пример.

@history = AccountingTransaction. 
    select([:reference_id, :transaction_type_id, :created_at]). 
    select(AccountingTransaction.arel_table[:credit].sum.as("credit_sum")). 
    where("customer_id in (?) AND no_download <> 1", customers_in_account). 
    group(:transaction_type_id, :reference_id). 
    order(:created_at) 

Чтобы получить доступ к credit_sum вы могли бы сделать:

@history[0].attributes["credit_sum"] 

Я думаю, если вы хотите, вы можете создать метод:

def credit_sum 
    attributes["credit_sum"] 
end 
  • EDIT *

Как указано в комментарии с вы можете получить доступ к атрибуту непосредственно:

@history[0].credit_sum 
+0

Отлично, это было в значительной степени! Мне пришлось внести несколько изменений, чтобы заставить его работать. Я изменил ': customer_id' на': reference_id', так как элемент 'GROUP BY' должен быть в списке выбора, а также добавлен': created_at' в список выбора, поскольку, как вы упомянули, элемент 'ORDER BY' также должен быть в списке выбора. Затем в первом списке выбора нескольких атрибутов отсутствуют скобки в скобках - для этого нужно выбрать '[select ([: reference_id,: transaction_type_id,: created_at])'. Вне этих изменений он работал красиво. Оценил! – circle1

+0

Вот почему я люблю stackoverflow.com! Отличная работа Магнес. Одна последняя вещь.Я смог получить доступ к credit_sum, просто используя 'h.credit_sum', когда я зациклился через' @history.each do | h | 'в Rails 3.2. – circle1

+0

А, отлично, я уточню свой ответ. – Magnuss

Смежные вопросы