この記事では、RailsのGemのRansackを使ってデータの絞り込みを行った後、コラムの合計値を計算したら結果があわなくて困った話を書きます。
sample_controller.rb
sample = Sample.all
@q = sample.ransack(params[:q])
@sample = @q.result(distinct: true)
@total_a = @sample.sum(:a)
@total_b = @sample.sum(:b)
@total_c = @sample.sum(:c)
のようにcontrollerを書いて、viewで適当なテーブルに出力すると、
下のテーブルのようになります。
id | a | b | c |
---|---|---|---|
1 | 100 | 100 | 100 |
2 | 100 | 100 | 100 |
3 | 100 | 100 | 100 |
合計 | 100 | 100 | 100 |
(distinct: true)としたので、重複データを同じものとみなしています。
コラムaは100のデータが1つだから、合計は100という風に処理されてしまいます。
sample_controller.rb
@sample = @q.result(distinct: false)
とすれば、重複データを別々のデータとして識別してくれます。
コラムaは100のデータと100のデータと100のデータがあるから、合計300と正しく処理してくれます。
id | a | b | c |
---|---|---|---|
1 | 100 | 100 | 100 |
2 | 100 | 100 | 100 |
3 | 100 | 100 | 100 |
合計 | 300 | 300 | 300 |