-
Notifications
You must be signed in to change notification settings - Fork 37
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
【園木】料金シミュレーションAPIの開発 #37
base: master
Are you sure you want to change the base?
Conversation
yournameディレクトリ名を変更
@ysk91 内容はこれから確認させていただきますが、ざっと見たところ、料金計算ロジックに対するテストが記載されておりませんでしたので追加お願いします。 |
ご指摘いただきありがとうございます。 |
price: total_cost | ||
} | ||
end | ||
render json: costs.to_json, status: 200 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
間違っていたらすみません。to_jsonって必要ですか。
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
costs自体が既にハッシュなので不要でした。
修正しました。
ysk91@7913bdf#diff-bebb16eb4b12378fcb91ff5afb5e43b378eb34c711f2a332446da3b0f13f8619R49
private | ||
|
||
def yaml_path | ||
Rails.root.join('config', 'rates.yml') |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
リクエスト来るたびに読み込むのは遅くなる原因になりますね
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
yaml_pathをコントローラ内でメモ化しました。
ysk91@7913bdf#diff-bebb16eb4b12378fcb91ff5afb5e43b378eb34c711f2a332446da3b0f13f8619R56
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
yaml_data自体をメモ化しました。
9286a10#diff-bebb16eb4b12378fcb91ff5afb5e43b378eb34c711f2a332446da3b0f13f8619R54
今はcosts_controllerの中で定義していますが、進める中で最適な場所を考えてみます。
usage = params[:usage] | ||
|
||
if usage == "0" | ||
render "input" |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
好みですが
render "input" | |
render :input |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
end | ||
data = JSON.parse(response.body) | ||
@results = data | ||
render "output" |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
render "output" っていりますか?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
<%= form_with url: output_simulations_path, method: :get, local: true do |f| %> | ||
<div> | ||
<%= f.label :contract_ampere, '契約アンペア数' %> | ||
<%= f.select :contract_ampere, [10, 15, 20, 30, 40, 50, 60], required: true %>A |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
[10, 15, 20, 30, 40, 50, 60]をviewにベタ書きするのは微妙ですね。
いろんなところにベタ書きが増えていき、メンテナンスが大変になりそうなので何処かにまとめておきたいです。
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
コントローラ内に変数として定義しました。
29d409f#diff-feb71b51f115d4dc122999f84a58fffda21b371b56e43d2cc617f3c84d49cd9aR31
SWVDjQKBgQCpqFddnSmatf6oQ/4u1DtGOsE53aRnhxyGr66LwdThD30af4r+6d92 | ||
7kZEDXcm3flAjzkpWNd2ifxOkxL8IPP88Twdhy9L/z2wK8Kg5iK4rB2MXwgwuYJV | ||
2VpWWL4BOd2syhXG98zoU2tTASYMGeOSJVgnw/O8VjSqIcuHqYecBw== | ||
-----END RSA PRIVATE KEY----- |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
これってなんの値でしょうか。
security的に、PRにあげていいものでしょうか。
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
AWSにアップしようとした時に作成したkeypairです。
gitignoreする前にcommitしたものが残っていました。
今はRenderにアップしているのでこのファイルは不要です。
削除しました。
8897705
usage = params[:usage].to_i | ||
rates = YAML.load_file(yaml_path) | ||
|
||
if contract_ampere.zero? || usage.zero? |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
リクエスト
契約アンペア数 : 10 / 15 / 20 / 30 / 40 / 50 / 60 のいずれかとする。(単位A)
上記の仕様があるので、フロント側制御のみではなく、サーバーサイド(API側)でバリデーションを入れたほうが良いですね
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
突貫対応ですが、表示するプランが無い場合にinputに戻すようにしました。
ただ、
- 本質的な解決ではない
- if節が増えてあまり美しくない
ので、より改善が必要だと感じています。。
29d409f#diff-feb71b51f115d4dc122999f84a58fffda21b371b56e43d2cc617f3c84d49cd9aR23
50: 1430.00 | ||
60: 1716.00 | ||
usage_rates: | ||
- range: [1, 120] |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
データベースに保存するとしたらどのような構造にするのが良いでしょうか?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Company has_many :plans という親子関係を作ります。
Companyには最低限以下のカラムを用意します。
- id
- name
Planには以下のカラムを用意します。
- id
- company_id
- name
- basic_rates
- usage_rates
PostgreSQLを使用している場合
マイグレーションファイルを以下のように設定することでbasic_rates
にJSONデータを、usage_rates
に配列データを格納することができます。
t.json :basic_rates
t.string :usage_rates, array: true, default: []
MySQLやSQLiteを使用している場合
マイグレーションファイルでテキスト型のデータを作成します。
t.text :basic_rates
t.text :usage_rates
その後、モデルファイルでシリアライズします。
serialize :basic_rates, JSON
serialize :usage_rates, Array
一例として、東京電力エナジーパートナーの従量電灯Bプランの場合、
basic_rates = {
10: 286.00,
15: 429.00,
20: 572.00,
30: 858.00,
40: 1144.00,
50: 1430.00,
60: 1716.00,
}
usage_rates = [
{range: [1, 120], rate: 19.88},
{range: [121, 300], rate: 26.48},
{range: [301, "inf"], rate: 30.57}
]
というデータを格納します。
コントローラファイルでは現在と同様の計算メソッドが使用できます。
参考
https://dev.classmethod.jp/articles/postgresql-14-supports-json-subscripting/
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
ありがとうございます!
カラムに配列型を使うメリット・デメリットを調べてみると勉強になると思います
@@ -0,0 +1,20 @@ | |||
The MIT License (MIT) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
node_modules は git 管理したほうがいいでしょうか?
|
||
if contract_ampere.zero? || usage.zero? | ||
render json: { error: 'Invalid input: contract_ampere and usage are required' }, status: 400 | ||
else |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
else ブロックがメソッドの大部分を占めてネストが深くなってますが、
ネストを浅く読みやすくする方法はないでしょうか?
@ysk91 |
計算ロジックをCostモデルに持たせた
レビューコメントを追加
コミット内容学習メモPlanモデルについて当初、PlanモデルとPlansLoaderモジュールが同じように思えてyamlデータをモデル化するメリットが分かりませんでした。
QueryモデルについてCostモデル内のバリデーション処理を 質問現在、 |
@ysk91 また以下の質問にも答えてしまいますと、プランが変更したときにテストを書き換える必要が出てくることこそテストの意味があるのです。とある変更して、期待通りテストが落ちてしまうことで、それまでテストが機能していたことの証明になるためです。
常々思いますが、疑問に思う点やそれを自己で解決されようとしている点が非常に素晴らしいなと思います。入社後もどんどん吸収していってください! |
やったこと
API開発
rates.yml
にデータ作成costs_controller.rb
にindexアクションとcalculate_rateアクションを作成テスト設計
costs_controller.rb
のリクエストspecを作成UI開発
simulations_controller.rb
にinputアクションとoutputアクションを作成本番環境構築
契約アンペア数
,使用量
を入力することで料金シミュレーションの結果を取得課題