電気料金比較APIの作成 - #29

Open
MasafumiKondo07 wants to merge 19 commits into
enechange:masterfrom
MasafumiKondo07:master
Open

電気料金比較APIの作成#29
MasafumiKondo07 wants to merge 19 commits into
enechange:masterfrom
MasafumiKondo07:master

Conversation

@MasafumiKondo07

@MasafumiKondo07MasafumiKondo07 commented Sep 20, 2022

Copy link
Copy Markdown

電気料金比較APIの提出になります。

ローカルでの動作確認手順

docker-compose build

docker-compose run web rails db:create

docker-compose up -d

下記にアクセス(parameterは適切な数値)
http://localhost:3000/api/v1/electricity_charges_simulators?ampere=10&amount_used=200

テストでの確認方法

controllerのテスト
docker-compose exec web rspec spec/controllers/electricity_charges_simulators_controller_spec.rb

modelのテスト(従量料金計算)
docker-compose exec web rspec spec/models/electricity_fee_spec.rb

def index
companies = Company.all
simulation_list = []
companies.each do |company|

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

N+1起きてないですか?

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ご指摘いただきましてありがとうございます。
ログを確認したところ、指摘いただいた通り、ループのたびにplansテーブルへのSQLが実行されていたため、下記のように修正しました。
14d1c7f

end

def electricity_fee(unit_price)
unit_price * params[:amount_used].to_i

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

従量料金の計算方法ですが、案内が紛らわしかったかもしれませんが、間違っています。後出しにはなりますが、正しい情報をとってくる能力もみたいので、調査して修正していただきたいです。

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

あとこの計算はelectricity_fee_instanceに任せた方がいいかもしれないです。controllerは肥大しやすいので、どこまでが責務とするのがベストか考えてみてほしいです。

basic_charge_instance = plan.basic_charges.find_by(ampere: params[:ampere])
next if basic_charge_instance.nil?
electricity_fee_instance = plan.electricity_fees.find_by(classification_min: ..params[:amount_used], classification_max: params[:amount_used]..)
electricity_fee_instance = plan.electricity_fees.find_by(classification_min: ..params[:amount_used], classification_max: nil) if electricity_fee_instance.nil?

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

||= を使うともっとシンプルに書けそうです


def calc_result(basic_charge, electricity_fee)
basic_charge + electricity_fee
end

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

この計算もmodelの責務な気がします。

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

152a767
こちら、合計金額の計算ということで、責務的にはplanが持つべきと判断したため、Planモデルへと移させていただきました🙏

electricity_fee_instance = plan.electricity_fees.find_by(classification_min: ..params[:amount_used], classification_max: nil) if electricity_fee_instance.nil?

simulation_list << {provider_name: company.name, plan_name: plan.name, price: calc_result(basic_charge_instance.price, electricity_fee(electricity_fee_instance.price))}
end

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

細かいですが、providerかcompanyかはどちらかに合わせたほうがいいと思います。

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ご指摘いただきましてありがとうございます。
おっしゃる通り、アプリの中でこういう、名称の違いがあると混乱しかねないため、companyに合わせさせていただきました。
096506e

4,30,1,858.00
4,40,1,1144.00
4,50,1,1430.00
4,60,1,1716.80 No newline at end of file

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

純粋な質問ですが、ここのunitってどういう用途で利用されますか?恐らく「単位」を指していると思いますが、会社によって、kwhだったり、契約数だったりまちまちのものを一緒くたにしてunitと管理してしまってもよいのでしょうか。

1,1,従量電灯B
2,2,おうちプラン
3,3,ずっとも電気1
4,4,従量電灯Bたっぷりプラン No newline at end of file

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ここのidとcompany_idを分けている意図について教えてください。一緒の値であれば、まとめてしまってもいいと思います。

t.integer :classification_min, null: false
t.integer :classification_max
t.integer :unit, null: false
t.decimal :price, null: false, scale: 2, precision: 6

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

整数型となっていますが、例えば小数が入るplanなどがある可能性も考慮すると、decimalにしたほうがいいのではないかと思いました。

usage_upper_limit = instance.classification_max.present? && instance.classification_max < amount_used ? instance.classification_max : amount_used
result += (usage_upper_limit - usage_lower_limit) * instance.price
end
result

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ここのロジックが一番複雑になるので、テストをしっかり書いてほしいです。期待値がなんであるか、その通りに出力されているか、テストに書いてあることでレビュワーは実際に動かさなくても結果が見えてきやすいので業務を効率よく行うためにテストは不可欠です。

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

electricity_fee_instance.calcで呼び出していると思うのですが、そのelectricity_fee_instanceって既にplanから呼び出しているものなのに、ここでまたplan_idから引っ張ってくるのって二度手間ではないですか?
find_byとwhereで似たようなことを2回してしまっていると思いました。

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

再度ご確認いただきましてありがとうございます🙏
従量料金を求めるロジックを下記のように修正させていただきました。
6d4fa21
b550e4c

またテストが書けていなかったことについて、申し訳ございませんでした。
従量料金計算テストと、controllerのテストを追加させていただきました。
2172b6e

d87fc4d

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@MasafumiKondo07@keishi1129@kashiwakuma-junya
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

電気料金比較APIの作成 - #29

Open
MasafumiKondo07 wants to merge 19 commits into
enechange:masterfrom
MasafumiKondo07:master
Open

電気料金比較APIの作成#29
MasafumiKondo07 wants to merge 19 commits into
enechange:masterfrom
MasafumiKondo07:master

Conversation

@MasafumiKondo07

@MasafumiKondo07MasafumiKondo07 commented Sep 20, 2022

Copy link
Copy Markdown

電気料金比較APIの提出になります。

ローカルでの動作確認手順

docker-compose build

docker-compose run web rails db:create

docker-compose up -d

下記にアクセス(parameterは適切な数値)
http://localhost:3000/api/v1/electricity_charges_simulators?ampere=10&amount_used=200

テストでの確認方法

controllerのテスト
docker-compose exec web rspec spec/controllers/electricity_charges_simulators_controller_spec.rb

modelのテスト(従量料金計算)
docker-compose exec web rspec spec/models/electricity_fee_spec.rb

def index
companies = Company.all
simulation_list = []
companies.each do |company|

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

N+1起きてないですか?

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ご指摘いただきましてありがとうございます。
ログを確認したところ、指摘いただいた通り、ループのたびにplansテーブルへのSQLが実行されていたため、下記のように修正しました。
14d1c7f

end

def electricity_fee(unit_price)
unit_price * params[:amount_used].to_i

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

従量料金の計算方法ですが、案内が紛らわしかったかもしれませんが、間違っています。後出しにはなりますが、正しい情報をとってくる能力もみたいので、調査して修正していただきたいです。

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

あとこの計算はelectricity_fee_instanceに任せた方がいいかもしれないです。controllerは肥大しやすいので、どこまでが責務とするのがベストか考えてみてほしいです。

basic_charge_instance = plan.basic_charges.find_by(ampere: params[:ampere])
next if basic_charge_instance.nil?
electricity_fee_instance = plan.electricity_fees.find_by(classification_min: ..params[:amount_used], classification_max: params[:amount_used]..)
electricity_fee_instance = plan.electricity_fees.find_by(classification_min: ..params[:amount_used], classification_max: nil) if electricity_fee_instance.nil?

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

||= を使うともっとシンプルに書けそうです


def calc_result(basic_charge, electricity_fee)
basic_charge + electricity_fee
end

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

この計算もmodelの責務な気がします。

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

152a767
こちら、合計金額の計算ということで、責務的にはplanが持つべきと判断したため、Planモデルへと移させていただきました🙏

electricity_fee_instance = plan.electricity_fees.find_by(classification_min: ..params[:amount_used], classification_max: nil) if electricity_fee_instance.nil?

simulation_list << {provider_name: company.name, plan_name: plan.name, price: calc_result(basic_charge_instance.price, electricity_fee(electricity_fee_instance.price))}
end

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

細かいですが、providerかcompanyかはどちらかに合わせたほうがいいと思います。

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ご指摘いただきましてありがとうございます。
おっしゃる通り、アプリの中でこういう、名称の違いがあると混乱しかねないため、companyに合わせさせていただきました。
096506e

4,30,1,858.00
4,40,1,1144.00
4,50,1,1430.00
4,60,1,1716.80 No newline at end of file

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

純粋な質問ですが、ここのunitってどういう用途で利用されますか?恐らく「単位」を指していると思いますが、会社によって、kwhだったり、契約数だったりまちまちのものを一緒くたにしてunitと管理してしまってもよいのでしょうか。

1,1,従量電灯B
2,2,おうちプラン
3,3,ずっとも電気1
4,4,従量電灯Bたっぷりプラン No newline at end of file

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ここのidとcompany_idを分けている意図について教えてください。一緒の値であれば、まとめてしまってもいいと思います。

t.integer :classification_min, null: false
t.integer :classification_max
t.integer :unit, null: false
t.decimal :price, null: false, scale: 2, precision: 6

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

整数型となっていますが、例えば小数が入るplanなどがある可能性も考慮すると、decimalにしたほうがいいのではないかと思いました。

usage_upper_limit = instance.classification_max.present? && instance.classification_max < amount_used ? instance.classification_max : amount_used
result += (usage_upper_limit - usage_lower_limit) * instance.price
end
result

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ここのロジックが一番複雑になるので、テストをしっかり書いてほしいです。期待値がなんであるか、その通りに出力されているか、テストに書いてあることでレビュワーは実際に動かさなくても結果が見えてきやすいので業務を効率よく行うためにテストは不可欠です。

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

electricity_fee_instance.calcで呼び出していると思うのですが、そのelectricity_fee_instanceって既にplanから呼び出しているものなのに、ここでまたplan_idから引っ張ってくるのって二度手間ではないですか?
find_byとwhereで似たようなことを2回してしまっていると思いました。

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

再度ご確認いただきましてありがとうございます🙏
従量料金を求めるロジックを下記のように修正させていただきました。
6d4fa21
b550e4c

またテストが書けていなかったことについて、申し訳ございませんでした。
従量料金計算テストと、controllerのテストを追加させていただきました。
2172b6e

d87fc4d

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@MasafumiKondo07@keishi1129@kashiwakuma-junya
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

電気料金比較APIの作成 - #29

Open
MasafumiKondo07 wants to merge 19 commits into
enechange:masterfrom
MasafumiKondo07:master
Open

電気料金比較APIの作成#29
MasafumiKondo07 wants to merge 19 commits into
enechange:masterfrom
MasafumiKondo07:master

Conversation

@MasafumiKondo07

@MasafumiKondo07MasafumiKondo07 commented Sep 20, 2022

Copy link
Copy Markdown

電気料金比較APIの提出になります。

ローカルでの動作確認手順

docker-compose build

docker-compose run web rails db:create

docker-compose up -d

下記にアクセス(parameterは適切な数値)
http://localhost:3000/api/v1/electricity_charges_simulators?ampere=10&amount_used=200

テストでの確認方法

controllerのテスト
docker-compose exec web rspec spec/controllers/electricity_charges_simulators_controller_spec.rb

modelのテスト(従量料金計算)
docker-compose exec web rspec spec/models/electricity_fee_spec.rb

def index
companies = Company.all
simulation_list = []
companies.each do |company|

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

N+1起きてないですか?

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ご指摘いただきましてありがとうございます。
ログを確認したところ、指摘いただいた通り、ループのたびにplansテーブルへのSQLが実行されていたため、下記のように修正しました。
14d1c7f

end

def electricity_fee(unit_price)
unit_price * params[:amount_used].to_i

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

従量料金の計算方法ですが、案内が紛らわしかったかもしれませんが、間違っています。後出しにはなりますが、正しい情報をとってくる能力もみたいので、調査して修正していただきたいです。

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

あとこの計算はelectricity_fee_instanceに任せた方がいいかもしれないです。controllerは肥大しやすいので、どこまでが責務とするのがベストか考えてみてほしいです。

basic_charge_instance = plan.basic_charges.find_by(ampere: params[:ampere])
next if basic_charge_instance.nil?
electricity_fee_instance = plan.electricity_fees.find_by(classification_min: ..params[:amount_used], classification_max: params[:amount_used]..)
electricity_fee_instance = plan.electricity_fees.find_by(classification_min: ..params[:amount_used], classification_max: nil) if electricity_fee_instance.nil?

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

||= を使うともっとシンプルに書けそうです


def calc_result(basic_charge, electricity_fee)
basic_charge + electricity_fee
end

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

この計算もmodelの責務な気がします。

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

152a767
こちら、合計金額の計算ということで、責務的にはplanが持つべきと判断したため、Planモデルへと移させていただきました🙏

electricity_fee_instance = plan.electricity_fees.find_by(classification_min: ..params[:amount_used], classification_max: nil) if electricity_fee_instance.nil?

simulation_list << {provider_name: company.name, plan_name: plan.name, price: calc_result(basic_charge_instance.price, electricity_fee(electricity_fee_instance.price))}
end

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

細かいですが、providerかcompanyかはどちらかに合わせたほうがいいと思います。

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ご指摘いただきましてありがとうございます。
おっしゃる通り、アプリの中でこういう、名称の違いがあると混乱しかねないため、companyに合わせさせていただきました。
096506e

4,30,1,858.00
4,40,1,1144.00
4,50,1,1430.00
4,60,1,1716.80 No newline at end of file

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

純粋な質問ですが、ここのunitってどういう用途で利用されますか?恐らく「単位」を指していると思いますが、会社によって、kwhだったり、契約数だったりまちまちのものを一緒くたにしてunitと管理してしまってもよいのでしょうか。

1,1,従量電灯B
2,2,おうちプラン
3,3,ずっとも電気1
4,4,従量電灯Bたっぷりプラン No newline at end of file

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ここのidとcompany_idを分けている意図について教えてください。一緒の値であれば、まとめてしまってもいいと思います。

t.integer :classification_min, null: false
t.integer :classification_max
t.integer :unit, null: false
t.decimal :price, null: false, scale: 2, precision: 6

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

整数型となっていますが、例えば小数が入るplanなどがある可能性も考慮すると、decimalにしたほうがいいのではないかと思いました。

usage_upper_limit = instance.classification_max.present? && instance.classification_max < amount_used ? instance.classification_max : amount_used
result += (usage_upper_limit - usage_lower_limit) * instance.price
end
result

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ここのロジックが一番複雑になるので、テストをしっかり書いてほしいです。期待値がなんであるか、その通りに出力されているか、テストに書いてあることでレビュワーは実際に動かさなくても結果が見えてきやすいので業務を効率よく行うためにテストは不可欠です。

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

electricity_fee_instance.calcで呼び出していると思うのですが、そのelectricity_fee_instanceって既にplanから呼び出しているものなのに、ここでまたplan_idから引っ張ってくるのって二度手間ではないですか?
find_byとwhereで似たようなことを2回してしまっていると思いました。

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

再度ご確認いただきましてありがとうございます🙏
従量料金を求めるロジックを下記のように修正させていただきました。
6d4fa21
b550e4c

またテストが書けていなかったことについて、申し訳ございませんでした。
従量料金計算テストと、controllerのテストを追加させていただきました。
2172b6e

d87fc4d

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@MasafumiKondo07@keishi1129@kashiwakuma-junya
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

電気料金比較APIの作成 - #29

Open
MasafumiKondo07 wants to merge 19 commits into
enechange:masterfrom
MasafumiKondo07:master
Open

電気料金比較APIの作成#29
MasafumiKondo07 wants to merge 19 commits into
enechange:masterfrom
MasafumiKondo07:master

Conversation

@MasafumiKondo07

@MasafumiKondo07MasafumiKondo07 commented Sep 20, 2022

Copy link
Copy Markdown

電気料金比較APIの提出になります。

ローカルでの動作確認手順

docker-compose build

docker-compose run web rails db:create

docker-compose up -d

下記にアクセス(parameterは適切な数値)
http://localhost:3000/api/v1/electricity_charges_simulators?ampere=10&amount_used=200

テストでの確認方法

controllerのテスト
docker-compose exec web rspec spec/controllers/electricity_charges_simulators_controller_spec.rb

modelのテスト(従量料金計算)
docker-compose exec web rspec spec/models/electricity_fee_spec.rb

def index
companies = Company.all
simulation_list = []
companies.each do |company|

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

N+1起きてないですか?

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ご指摘いただきましてありがとうございます。
ログを確認したところ、指摘いただいた通り、ループのたびにplansテーブルへのSQLが実行されていたため、下記のように修正しました。
14d1c7f

end

def electricity_fee(unit_price)
unit_price * params[:amount_used].to_i

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

従量料金の計算方法ですが、案内が紛らわしかったかもしれませんが、間違っています。後出しにはなりますが、正しい情報をとってくる能力もみたいので、調査して修正していただきたいです。

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

あとこの計算はelectricity_fee_instanceに任せた方がいいかもしれないです。controllerは肥大しやすいので、どこまでが責務とするのがベストか考えてみてほしいです。

basic_charge_instance = plan.basic_charges.find_by(ampere: params[:ampere])
next if basic_charge_instance.nil?
electricity_fee_instance = plan.electricity_fees.find_by(classification_min: ..params[:amount_used], classification_max: params[:amount_used]..)
electricity_fee_instance = plan.electricity_fees.find_by(classification_min: ..params[:amount_used], classification_max: nil) if electricity_fee_instance.nil?

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

||= を使うともっとシンプルに書けそうです


def calc_result(basic_charge, electricity_fee)
basic_charge + electricity_fee
end

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

この計算もmodelの責務な気がします。

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

152a767
こちら、合計金額の計算ということで、責務的にはplanが持つべきと判断したため、Planモデルへと移させていただきました🙏

electricity_fee_instance = plan.electricity_fees.find_by(classification_min: ..params[:amount_used], classification_max: nil) if electricity_fee_instance.nil?

simulation_list << {provider_name: company.name, plan_name: plan.name, price: calc_result(basic_charge_instance.price, electricity_fee(electricity_fee_instance.price))}
end

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

細かいですが、providerかcompanyかはどちらかに合わせたほうがいいと思います。

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ご指摘いただきましてありがとうございます。
おっしゃる通り、アプリの中でこういう、名称の違いがあると混乱しかねないため、companyに合わせさせていただきました。
096506e

4,30,1,858.00
4,40,1,1144.00
4,50,1,1430.00
4,60,1,1716.80 No newline at end of file

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

純粋な質問ですが、ここのunitってどういう用途で利用されますか?恐らく「単位」を指していると思いますが、会社によって、kwhだったり、契約数だったりまちまちのものを一緒くたにしてunitと管理してしまってもよいのでしょうか。

1,1,従量電灯B
2,2,おうちプラン
3,3,ずっとも電気1
4,4,従量電灯Bたっぷりプラン No newline at end of file

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ここのidとcompany_idを分けている意図について教えてください。一緒の値であれば、まとめてしまってもいいと思います。

t.integer :classification_min, null: false
t.integer :classification_max
t.integer :unit, null: false
t.decimal :price, null: false, scale: 2, precision: 6

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

整数型となっていますが、例えば小数が入るplanなどがある可能性も考慮すると、decimalにしたほうがいいのではないかと思いました。

usage_upper_limit = instance.classification_max.present? && instance.classification_max < amount_used ? instance.classification_max : amount_used
result += (usage_upper_limit - usage_lower_limit) * instance.price
end
result

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ここのロジックが一番複雑になるので、テストをしっかり書いてほしいです。期待値がなんであるか、その通りに出力されているか、テストに書いてあることでレビュワーは実際に動かさなくても結果が見えてきやすいので業務を効率よく行うためにテストは不可欠です。

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

electricity_fee_instance.calcで呼び出していると思うのですが、そのelectricity_fee_instanceって既にplanから呼び出しているものなのに、ここでまたplan_idから引っ張ってくるのって二度手間ではないですか?
find_byとwhereで似たようなことを2回してしまっていると思いました。

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

再度ご確認いただきましてありがとうございます🙏
従量料金を求めるロジックを下記のように修正させていただきました。
6d4fa21
b550e4c

またテストが書けていなかったことについて、申し訳ございませんでした。
従量料金計算テストと、controllerのテストを追加させていただきました。
2172b6e

d87fc4d

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@MasafumiKondo07@keishi1129@kashiwakuma-junya
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

電気料金比較APIの作成 - #29

Open
MasafumiKondo07 wants to merge 19 commits into
enechange:masterfrom
MasafumiKondo07:master
Open

電気料金比較APIの作成#29
MasafumiKondo07 wants to merge 19 commits into
enechange:masterfrom
MasafumiKondo07:master

Conversation

@MasafumiKondo07

@MasafumiKondo07MasafumiKondo07 commented Sep 20, 2022

Copy link
Copy Markdown

電気料金比較APIの提出になります。

ローカルでの動作確認手順

docker-compose build

docker-compose run web rails db:create

docker-compose up -d

下記にアクセス(parameterは適切な数値)
http://localhost:3000/api/v1/electricity_charges_simulators?ampere=10&amount_used=200

テストでの確認方法

controllerのテスト
docker-compose exec web rspec spec/controllers/electricity_charges_simulators_controller_spec.rb

modelのテスト(従量料金計算)
docker-compose exec web rspec spec/models/electricity_fee_spec.rb

def index
companies = Company.all
simulation_list = []
companies.each do |company|

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

N+1起きてないですか?

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ご指摘いただきましてありがとうございます。
ログを確認したところ、指摘いただいた通り、ループのたびにplansテーブルへのSQLが実行されていたため、下記のように修正しました。
14d1c7f

end

def electricity_fee(unit_price)
unit_price * params[:amount_used].to_i

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

従量料金の計算方法ですが、案内が紛らわしかったかもしれませんが、間違っています。後出しにはなりますが、正しい情報をとってくる能力もみたいので、調査して修正していただきたいです。

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

あとこの計算はelectricity_fee_instanceに任せた方がいいかもしれないです。controllerは肥大しやすいので、どこまでが責務とするのがベストか考えてみてほしいです。

basic_charge_instance = plan.basic_charges.find_by(ampere: params[:ampere])
next if basic_charge_instance.nil?
electricity_fee_instance = plan.electricity_fees.find_by(classification_min: ..params[:amount_used], classification_max: params[:amount_used]..)
electricity_fee_instance = plan.electricity_fees.find_by(classification_min: ..params[:amount_used], classification_max: nil) if electricity_fee_instance.nil?

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

||= を使うともっとシンプルに書けそうです


def calc_result(basic_charge, electricity_fee)
basic_charge + electricity_fee
end

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

この計算もmodelの責務な気がします。

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

152a767
こちら、合計金額の計算ということで、責務的にはplanが持つべきと判断したため、Planモデルへと移させていただきました🙏

electricity_fee_instance = plan.electricity_fees.find_by(classification_min: ..params[:amount_used], classification_max: nil) if electricity_fee_instance.nil?

simulation_list << {provider_name: company.name, plan_name: plan.name, price: calc_result(basic_charge_instance.price, electricity_fee(electricity_fee_instance.price))}
end

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

細かいですが、providerかcompanyかはどちらかに合わせたほうがいいと思います。

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ご指摘いただきましてありがとうございます。
おっしゃる通り、アプリの中でこういう、名称の違いがあると混乱しかねないため、companyに合わせさせていただきました。
096506e

4,30,1,858.00
4,40,1,1144.00
4,50,1,1430.00
4,60,1,1716.80 No newline at end of file

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

純粋な質問ですが、ここのunitってどういう用途で利用されますか?恐らく「単位」を指していると思いますが、会社によって、kwhだったり、契約数だったりまちまちのものを一緒くたにしてunitと管理してしまってもよいのでしょうか。

1,1,従量電灯B
2,2,おうちプラン
3,3,ずっとも電気1
4,4,従量電灯Bたっぷりプラン No newline at end of file

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ここのidとcompany_idを分けている意図について教えてください。一緒の値であれば、まとめてしまってもいいと思います。

t.integer :classification_min, null: false
t.integer :classification_max
t.integer :unit, null: false
t.decimal :price, null: false, scale: 2, precision: 6

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

整数型となっていますが、例えば小数が入るplanなどがある可能性も考慮すると、decimalにしたほうがいいのではないかと思いました。

usage_upper_limit = instance.classification_max.present? && instance.classification_max < amount_used ? instance.classification_max : amount_used
result += (usage_upper_limit - usage_lower_limit) * instance.price
end
result

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ここのロジックが一番複雑になるので、テストをしっかり書いてほしいです。期待値がなんであるか、その通りに出力されているか、テストに書いてあることでレビュワーは実際に動かさなくても結果が見えてきやすいので業務を効率よく行うためにテストは不可欠です。

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

electricity_fee_instance.calcで呼び出していると思うのですが、そのelectricity_fee_instanceって既にplanから呼び出しているものなのに、ここでまたplan_idから引っ張ってくるのって二度手間ではないですか?
find_byとwhereで似たようなことを2回してしまっていると思いました。

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

再度ご確認いただきましてありがとうございます🙏
従量料金を求めるロジックを下記のように修正させていただきました。
6d4fa21
b550e4c

またテストが書けていなかったことについて、申し訳ございませんでした。
従量料金計算テストと、controllerのテストを追加させていただきました。
2172b6e

d87fc4d

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@MasafumiKondo07@keishi1129@kashiwakuma-junya
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

電気料金比較APIの作成 - #29

Open
MasafumiKondo07 wants to merge 19 commits into
enechange:masterfrom
MasafumiKondo07:master
Open

電気料金比較APIの作成#29
MasafumiKondo07 wants to merge 19 commits into
enechange:masterfrom
MasafumiKondo07:master

Conversation

@MasafumiKondo07

@MasafumiKondo07MasafumiKondo07 commented Sep 20, 2022

Copy link
Copy Markdown

電気料金比較APIの提出になります。

ローカルでの動作確認手順

docker-compose build

docker-compose run web rails db:create

docker-compose up -d

下記にアクセス(parameterは適切な数値)
http://localhost:3000/api/v1/electricity_charges_simulators?ampere=10&amount_used=200

テストでの確認方法

controllerのテスト
docker-compose exec web rspec spec/controllers/electricity_charges_simulators_controller_spec.rb

modelのテスト(従量料金計算)
docker-compose exec web rspec spec/models/electricity_fee_spec.rb

def index
companies = Company.all
simulation_list = []
companies.each do |company|

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

N+1起きてないですか?

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ご指摘いただきましてありがとうございます。
ログを確認したところ、指摘いただいた通り、ループのたびにplansテーブルへのSQLが実行されていたため、下記のように修正しました。
14d1c7f

end

def electricity_fee(unit_price)
unit_price * params[:amount_used].to_i

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

従量料金の計算方法ですが、案内が紛らわしかったかもしれませんが、間違っています。後出しにはなりますが、正しい情報をとってくる能力もみたいので、調査して修正していただきたいです。

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

あとこの計算はelectricity_fee_instanceに任せた方がいいかもしれないです。controllerは肥大しやすいので、どこまでが責務とするのがベストか考えてみてほしいです。

basic_charge_instance = plan.basic_charges.find_by(ampere: params[:ampere])
next if basic_charge_instance.nil?
electricity_fee_instance = plan.electricity_fees.find_by(classification_min: ..params[:amount_used], classification_max: params[:amount_used]..)
electricity_fee_instance = plan.electricity_fees.find_by(classification_min: ..params[:amount_used], classification_max: nil) if electricity_fee_instance.nil?

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

||= を使うともっとシンプルに書けそうです


def calc_result(basic_charge, electricity_fee)
basic_charge + electricity_fee
end

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

この計算もmodelの責務な気がします。

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

152a767
こちら、合計金額の計算ということで、責務的にはplanが持つべきと判断したため、Planモデルへと移させていただきました🙏

electricity_fee_instance = plan.electricity_fees.find_by(classification_min: ..params[:amount_used], classification_max: nil) if electricity_fee_instance.nil?

simulation_list << {provider_name: company.name, plan_name: plan.name, price: calc_result(basic_charge_instance.price, electricity_fee(electricity_fee_instance.price))}
end

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

細かいですが、providerかcompanyかはどちらかに合わせたほうがいいと思います。

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ご指摘いただきましてありがとうございます。
おっしゃる通り、アプリの中でこういう、名称の違いがあると混乱しかねないため、companyに合わせさせていただきました。
096506e

4,30,1,858.00
4,40,1,1144.00
4,50,1,1430.00
4,60,1,1716.80 No newline at end of file

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

純粋な質問ですが、ここのunitってどういう用途で利用されますか?恐らく「単位」を指していると思いますが、会社によって、kwhだったり、契約数だったりまちまちのものを一緒くたにしてunitと管理してしまってもよいのでしょうか。

1,1,従量電灯B
2,2,おうちプラン
3,3,ずっとも電気1
4,4,従量電灯Bたっぷりプラン No newline at end of file

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ここのidとcompany_idを分けている意図について教えてください。一緒の値であれば、まとめてしまってもいいと思います。

t.integer :classification_min, null: false
t.integer :classification_max
t.integer :unit, null: false
t.decimal :price, null: false, scale: 2, precision: 6

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

整数型となっていますが、例えば小数が入るplanなどがある可能性も考慮すると、decimalにしたほうがいいのではないかと思いました。

usage_upper_limit = instance.classification_max.present? && instance.classification_max < amount_used ? instance.classification_max : amount_used
result += (usage_upper_limit - usage_lower_limit) * instance.price
end
result

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ここのロジックが一番複雑になるので、テストをしっかり書いてほしいです。期待値がなんであるか、その通りに出力されているか、テストに書いてあることでレビュワーは実際に動かさなくても結果が見えてきやすいので業務を効率よく行うためにテストは不可欠です。

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

electricity_fee_instance.calcで呼び出していると思うのですが、そのelectricity_fee_instanceって既にplanから呼び出しているものなのに、ここでまたplan_idから引っ張ってくるのって二度手間ではないですか?
find_byとwhereで似たようなことを2回してしまっていると思いました。

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

再度ご確認いただきましてありがとうございます🙏
従量料金を求めるロジックを下記のように修正させていただきました。
6d4fa21
b550e4c

またテストが書けていなかったことについて、申し訳ございませんでした。
従量料金計算テストと、controllerのテストを追加させていただきました。
2172b6e

d87fc4d

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@MasafumiKondo07@keishi1129@kashiwakuma-junya
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

電気料金比較APIの作成 - #29

Open
MasafumiKondo07 wants to merge 19 commits into
enechange:masterfrom
MasafumiKondo07:master
Open

電気料金比較APIの作成#29
MasafumiKondo07 wants to merge 19 commits into
enechange:masterfrom
MasafumiKondo07:master

Conversation

@MasafumiKondo07

@MasafumiKondo07MasafumiKondo07 commented Sep 20, 2022

Copy link
Copy Markdown

電気料金比較APIの提出になります。

ローカルでの動作確認手順

docker-compose build

docker-compose run web rails db:create

docker-compose up -d

下記にアクセス(parameterは適切な数値)
http://localhost:3000/api/v1/electricity_charges_simulators?ampere=10&amount_used=200

テストでの確認方法

controllerのテスト
docker-compose exec web rspec spec/controllers/electricity_charges_simulators_controller_spec.rb

modelのテスト(従量料金計算)
docker-compose exec web rspec spec/models/electricity_fee_spec.rb

def index
companies = Company.all
simulation_list = []
companies.each do |company|

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

N+1起きてないですか?

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ご指摘いただきましてありがとうございます。
ログを確認したところ、指摘いただいた通り、ループのたびにplansテーブルへのSQLが実行されていたため、下記のように修正しました。
14d1c7f

end

def electricity_fee(unit_price)
unit_price * params[:amount_used].to_i

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

従量料金の計算方法ですが、案内が紛らわしかったかもしれませんが、間違っています。後出しにはなりますが、正しい情報をとってくる能力もみたいので、調査して修正していただきたいです。

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

あとこの計算はelectricity_fee_instanceに任せた方がいいかもしれないです。controllerは肥大しやすいので、どこまでが責務とするのがベストか考えてみてほしいです。

basic_charge_instance = plan.basic_charges.find_by(ampere: params[:ampere])
next if basic_charge_instance.nil?
electricity_fee_instance = plan.electricity_fees.find_by(classification_min: ..params[:amount_used], classification_max: params[:amount_used]..)
electricity_fee_instance = plan.electricity_fees.find_by(classification_min: ..params[:amount_used], classification_max: nil) if electricity_fee_instance.nil?

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

||= を使うともっとシンプルに書けそうです


def calc_result(basic_charge, electricity_fee)
basic_charge + electricity_fee
end

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

この計算もmodelの責務な気がします。

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

152a767
こちら、合計金額の計算ということで、責務的にはplanが持つべきと判断したため、Planモデルへと移させていただきました🙏

electricity_fee_instance = plan.electricity_fees.find_by(classification_min: ..params[:amount_used], classification_max: nil) if electricity_fee_instance.nil?

simulation_list << {provider_name: company.name, plan_name: plan.name, price: calc_result(basic_charge_instance.price, electricity_fee(electricity_fee_instance.price))}
end

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

細かいですが、providerかcompanyかはどちらかに合わせたほうがいいと思います。

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ご指摘いただきましてありがとうございます。
おっしゃる通り、アプリの中でこういう、名称の違いがあると混乱しかねないため、companyに合わせさせていただきました。
096506e

4,30,1,858.00
4,40,1,1144.00
4,50,1,1430.00
4,60,1,1716.80 No newline at end of file

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

純粋な質問ですが、ここのunitってどういう用途で利用されますか?恐らく「単位」を指していると思いますが、会社によって、kwhだったり、契約数だったりまちまちのものを一緒くたにしてunitと管理してしまってもよいのでしょうか。

1,1,従量電灯B
2,2,おうちプラン
3,3,ずっとも電気1
4,4,従量電灯Bたっぷりプラン No newline at end of file

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ここのidとcompany_idを分けている意図について教えてください。一緒の値であれば、まとめてしまってもいいと思います。

t.integer :classification_min, null: false
t.integer :classification_max
t.integer :unit, null: false
t.decimal :price, null: false, scale: 2, precision: 6

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

整数型となっていますが、例えば小数が入るplanなどがある可能性も考慮すると、decimalにしたほうがいいのではないかと思いました。

usage_upper_limit = instance.classification_max.present? && instance.classification_max < amount_used ? instance.classification_max : amount_used
result += (usage_upper_limit - usage_lower_limit) * instance.price
end
result

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ここのロジックが一番複雑になるので、テストをしっかり書いてほしいです。期待値がなんであるか、その通りに出力されているか、テストに書いてあることでレビュワーは実際に動かさなくても結果が見えてきやすいので業務を効率よく行うためにテストは不可欠です。

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

electricity_fee_instance.calcで呼び出していると思うのですが、そのelectricity_fee_instanceって既にplanから呼び出しているものなのに、ここでまたplan_idから引っ張ってくるのって二度手間ではないですか?
find_byとwhereで似たようなことを2回してしまっていると思いました。

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

再度ご確認いただきましてありがとうございます🙏
従量料金を求めるロジックを下記のように修正させていただきました。
6d4fa21
b550e4c

またテストが書けていなかったことについて、申し訳ございませんでした。
従量料金計算テストと、controllerのテストを追加させていただきました。
2172b6e

d87fc4d

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@MasafumiKondo07@keishi1129@kashiwakuma-junya
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

電気料金比較APIの作成 - #29

Open
MasafumiKondo07 wants to merge 19 commits into
enechange:masterfrom
MasafumiKondo07:master
Open

電気料金比較APIの作成#29
MasafumiKondo07 wants to merge 19 commits into
enechange:masterfrom
MasafumiKondo07:master

Conversation

@MasafumiKondo07

@MasafumiKondo07MasafumiKondo07 commented Sep 20, 2022

Copy link
Copy Markdown

電気料金比較APIの提出になります。

ローカルでの動作確認手順

docker-compose build

docker-compose run web rails db:create

docker-compose up -d

下記にアクセス(parameterは適切な数値)
http://localhost:3000/api/v1/electricity_charges_simulators?ampere=10&amount_used=200

テストでの確認方法

controllerのテスト
docker-compose exec web rspec spec/controllers/electricity_charges_simulators_controller_spec.rb

modelのテスト(従量料金計算)
docker-compose exec web rspec spec/models/electricity_fee_spec.rb

def index
companies = Company.all
simulation_list = []
companies.each do |company|

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

N+1起きてないですか?

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ご指摘いただきましてありがとうございます。
ログを確認したところ、指摘いただいた通り、ループのたびにplansテーブルへのSQLが実行されていたため、下記のように修正しました。
14d1c7f

end

def electricity_fee(unit_price)
unit_price * params[:amount_used].to_i

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

従量料金の計算方法ですが、案内が紛らわしかったかもしれませんが、間違っています。後出しにはなりますが、正しい情報をとってくる能力もみたいので、調査して修正していただきたいです。

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

あとこの計算はelectricity_fee_instanceに任せた方がいいかもしれないです。controllerは肥大しやすいので、どこまでが責務とするのがベストか考えてみてほしいです。

basic_charge_instance = plan.basic_charges.find_by(ampere: params[:ampere])
next if basic_charge_instance.nil?
electricity_fee_instance = plan.electricity_fees.find_by(classification_min: ..params[:amount_used], classification_max: params[:amount_used]..)
electricity_fee_instance = plan.electricity_fees.find_by(classification_min: ..params[:amount_used], classification_max: nil) if electricity_fee_instance.nil?

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

||= を使うともっとシンプルに書けそうです


def calc_result(basic_charge, electricity_fee)
basic_charge + electricity_fee
end

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

この計算もmodelの責務な気がします。

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

152a767
こちら、合計金額の計算ということで、責務的にはplanが持つべきと判断したため、Planモデルへと移させていただきました🙏

electricity_fee_instance = plan.electricity_fees.find_by(classification_min: ..params[:amount_used], classification_max: nil) if electricity_fee_instance.nil?

simulation_list << {provider_name: company.name, plan_name: plan.name, price: calc_result(basic_charge_instance.price, electricity_fee(electricity_fee_instance.price))}
end

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

細かいですが、providerかcompanyかはどちらかに合わせたほうがいいと思います。

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ご指摘いただきましてありがとうございます。
おっしゃる通り、アプリの中でこういう、名称の違いがあると混乱しかねないため、companyに合わせさせていただきました。
096506e

4,30,1,858.00
4,40,1,1144.00
4,50,1,1430.00
4,60,1,1716.80 No newline at end of file

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

純粋な質問ですが、ここのunitってどういう用途で利用されますか?恐らく「単位」を指していると思いますが、会社によって、kwhだったり、契約数だったりまちまちのものを一緒くたにしてunitと管理してしまってもよいのでしょうか。

1,1,従量電灯B
2,2,おうちプラン
3,3,ずっとも電気1
4,4,従量電灯Bたっぷりプラン No newline at end of file

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ここのidとcompany_idを分けている意図について教えてください。一緒の値であれば、まとめてしまってもいいと思います。

t.integer :classification_min, null: false
t.integer :classification_max
t.integer :unit, null: false
t.decimal :price, null: false, scale: 2, precision: 6

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

整数型となっていますが、例えば小数が入るplanなどがある可能性も考慮すると、decimalにしたほうがいいのではないかと思いました。

usage_upper_limit = instance.classification_max.present? && instance.classification_max < amount_used ? instance.classification_max : amount_used
result += (usage_upper_limit - usage_lower_limit) * instance.price
end
result

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ここのロジックが一番複雑になるので、テストをしっかり書いてほしいです。期待値がなんであるか、その通りに出力されているか、テストに書いてあることでレビュワーは実際に動かさなくても結果が見えてきやすいので業務を効率よく行うためにテストは不可欠です。

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

electricity_fee_instance.calcで呼び出していると思うのですが、そのelectricity_fee_instanceって既にplanから呼び出しているものなのに、ここでまたplan_idから引っ張ってくるのって二度手間ではないですか?
find_byとwhereで似たようなことを2回してしまっていると思いました。

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

再度ご確認いただきましてありがとうございます🙏
従量料金を求めるロジックを下記のように修正させていただきました。
6d4fa21
b550e4c

またテストが書けていなかったことについて、申し訳ございませんでした。
従量料金計算テストと、controllerのテストを追加させていただきました。
2172b6e

d87fc4d

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@MasafumiKondo07@keishi1129@kashiwakuma-junya