0

会計トランザクション履歴の画面へのレポートを生成しようとしています。AccountingTransactionほとんどの場合、テーブル内のレコードごとに 1 つの表示行です。しかし、ときどき、エンド ユーザーに 1 つのトランザクションとして表示したいトランザクションがあります。実際には、舞台裏では 2 つの会計トランザクションです。これは、このアプリが資金会計アプリであるため、収益の繰り延べと資金分割が原因です。

すべての行を 1 つずつ表示すると、資金の分割と延期は「舞台裏」で行われるため、これらの二重エントリはユーザーにとって奇妙に見えます。したがって、関連するすべてのトランザクションを画面上の 1 つの表示行にロールアップしたいと考えています。

group by を使用して、関連するトランザクションをグループ化するクエリを作成しました。

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

ループを実行すると、必要に応じてトランザクションがグループ化されますが、グループ内のすべてのレコードの「クレジット」フィールドの合計を表示する方法に苦労しています。(グループの最初のレコードのクレジットのみを表示し.sum(:credit)ています)もちろん、クエリに a を追加すると、必要な合計が返されますが、他のすべてのデータは返されません。

クエリのようにこれらのレコードをグループ@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
4

1 に答える 1

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
  • 編集 *

コメントで述べたように、属性に直接アクセスできます。

@history[0].credit_sum
于 2013-10-02T18:01:01.360 に答える