1
2

【Ruby on Rails】学習メモ:配列と繰り返しで金額を集計したい!①

Posted at

今回はRuby on Railsの学習メモです。
学習の記録および備忘録として記します。

筆者のステータス

引き続き、Ruby on Railsを学習中。
改修を担当している機能にて、配列やループ処理(繰り返し)を用いる場面が増えてきている。

実現したいこと

ある事柄に関する、項目別合計金額の集計、表示。
集計対象は次のような要素で成り立っている。

  • 大項目
  • 中項目
  • 金額

本稿では、大項目=品名、中項目=手数料 として記述。
同じ品名でも異なる手数料が設定されている場合があり、金額と手数料(%)をもとに、手数料の具体的な金額を計算する必要がある。

  • 集計対象のイメージ
| 品名 | 手数料 | 金額 | 
------------------------
| 野菜  | 5%    | 300 | 
| 野菜  | 10%   | 200 | 
| 野菜  | 10%   | 800 | 
| 果物  | 8%    | 500 | 
| 果物  | 10%   | 300 | 
| 果物  | 10%   | 300 | 
| 果物  | 10%   | 500 | 
| ?    | 10%   | 500 | ★そのままでは「品名」が特定できないレコードが含まれている
 ...
 ......

金額を集計するにあたって、次の形でデータを整理する。

[[大項目, 中項目], 金額]

前述のデータの、集計後のイメージ。
最終的に「品名」と「手数料(%)」の組み合わせごとに合計金額を計算したい。
加えて「手数料(円)」の合計と「合計金額」の合計も算出する必要がある。

| 品名 | 手数料(%) | 金額  | 手数料(円) | 合計金額 | 
-------------------------------------------------
| 野菜  | 5%       | 300  | 60        | 360     | 
| 野菜  | 10%      | 1000 | 100       | 1100    |
| 果物  | 8%       | 500  | 40        | 540     |
| 果物  | 10%      | 1100 | 110       | 1210    |
 ...
 ......

なお、今回は既存ソースの修正である。

今回の困りごと

取り扱うレコードの中に「品名」が欠損したレコードが混ざっている場合があるが、実装済みの正常ルートのみではこれらに対応できない。
すでにある情報を用いて「品名」を特定し、その他のレコードと同じように集計する必要がある。
また、お金の計算処理に不具合があり、正しい結果が出せていない。

今回やったこと+反省

本稿ではかなり簡略化して記載していますが、複数のループ処理が入れ子になっていました。今回はそのソースに対して特定の条件がそろったときに用いる例外的なルートを追加するための修正を実施しました。
このルートでは上記の「品名」にあたる情報を正常ルート同様の方法で取得することができず、レコードに含まれる各種情報を用いて別のテーブルから「品名」を取得する必要がありました。

元々は入れ子といえど比較的単純な実装で済んでいたのですが、例外ルートの「品名」取得を実現しようとした結果、参照先が増え、ループが増え、データ整理のための配列が増え、まだうまくいかないのでハッシュを用いて……といった具合に実装がどんどん複雑化していきました。

最終的には求めていた処理を実現してくれるものができましたが、いかんせん何が起こっているか分かりづらいものになっています。自分でさえ後から読むのに苦労するようなソースコードには、やはり改善の余地が大きく残されていると考えるべきでしょう。

さいごに

次回の記事にて、今回行った修正についてもう少し踏み込んだ内容に触れる予定です。
執筆の中で、筆者自身も振り返りと改善点の発見ができればと思います。

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2