お住まいの地域が未登録時はnilが保存され、既存のデータベース内の空文字列はnilへと変換する#8446
Conversation
|
@mousu-a |
|
@SuzukiShuntarou |
There was a problem hiding this comment.
@SuzukiShuntarou
お疲れ様です🍵
変更確認方法とてもわかりやすかったです!ありがとうございました😊
二点ほど気になる点にコメントさせていただきました!
ご確認のほどよろしくお願いいたします🙏
| end | ||
|
|
||
| def convert_blank_of_country_code_to_nil | ||
| self.country_code = nil if country_code.blank? |
There was a problem hiding this comment.
提案です!
好みの部分だと思いますが、他のほとんどのメソッドはselfをつけていないので既存の実装に合わせてselfをなくしてもいいかも?と思いました。
There was a problem hiding this comment.
ご指摘ありがとうございます!実はこのselfについては自分も悩んでいたところで、実装時に理由までちゃんと調べきれていなかったので助かりました。今回のご指摘を踏まえて調べた内容を共有いたします。
動作
理由
- こちらチェリー本の『selfの付け忘れで不具合が発生するケース』が該当となります。(もしお持ちでしたらチェリー本も読んでいただければ分かりやすいかと思います。)結論としては
selfを付けない場合は『country_codeというローカル変数として解釈され、ローカル変数への代入と判断される』ことがバリデーションエラーとなる原因みたいです。 - 一方、
if country_code.blank?の場合はモデルの属性のcontry_codeを参照されるため、selfを省略しても問題がなくモデルの属性に対してblank?メソッドを呼び出す形となります。
補足
- こちらで似たようなことをしているので参考になりそうです。
There was a problem hiding this comment.
返信ありがとうございます!
selfを付けない場合、『登録しない』を選択して保存するとバリデーションエラーとなります。
あーすみません!気づきませんでした🙇♂️
実装時に理由までちゃんと調べきれていなかったので助かりました。
そういっていただけると助かります🙏
参考まで詳細にありがとうございます🙇♂️
とてもわかりやすく、腹落ちできました!
test/models/user_test.rb
Outdated
| assert_equal 2, user.latest_micro_report_page | ||
| end | ||
|
|
||
| test 'convert to nil during saving when country_code is empty string' do |
There was a problem hiding this comment.
質問です!
このテストと下のテストですが、ストーリーが似通っているので一緒にしてしまってもいいのかなと思いました。(1つのテスト内でcountry_code,subdivision_code どちらもテストする)
何か分けた理由があれば教えていただきたいです🙏
There was a problem hiding this comment.
ありがとうございます!
私も当初は1つのテストで実装しようと検討していたのですが、モデル側でメソッドを別々に定義したため、対応するテストも別々にすべきかと思い、分割いたしました。度々恐れ入りますが、アドバイスいただければ嬉しいです🙏
There was a problem hiding this comment.
なるほどです。
各メソッドに対応したテストのため対応するテストも別々に、ということですね👀
以下それに関して自分の考えを言語化してみました!ご参考までに🙇♂️
個人的には、a_method, b_methodに対するtest #a_method,test #b_methodという形のテストであれば、"対応するテストもそれぞれ用意する"、というロジックがすんなり入ってくるのですが、今回のような場合はどうなんでしょうか🤔
今回の場合はバリデーションで実行されるメソッドのテストで、やっていること(中身)はほとんどシステムテストに近いように思います。なのでパッと見た時に、「メソッドごとに分割せずまとめてしまっても良いのかな?」と感じたのだと思います。
パッと見た時に感じた違和感を言語化してみたのですが、ちょっとハッキリ「コレ!」って確信が持てないです😅
このあたりの判断はkomagataさんにお任せしたいと思います🙇♂️
お答えいただきありがとうございました!!🙏
| @@ -0,0 +1,19 @@ | |||
| # frozen_string_literal: true | |||
|
|
|||
| class ConvertBlankOfCountryCodeAndSubdivisionCodeToNil < ActiveRecord::Migration[6.1] | |||
|
@mousu-a
|
There was a problem hiding this comment.
@SuzukiShuntarou
お疲れ様です🍵
コメント返信させていただきました!
LGTMです✨
疑問点が解消できましたのでこちらからはApproveとさせていただきます〜!
app/models/user.rb
Outdated
| self.country_code = nil if country_code.blank? | ||
| end | ||
|
|
||
| def convert_blank_of_subdivision_code_to_nil |
There was a problem hiding this comment.
この二つ、やっていることは簡単なのに名前が長くて複雑な感じが増しちゃうので1つのメソッド処理したほうがいいように思いました。
There was a problem hiding this comment.
@komagata
レビューありがとうございます!一つのメソッドにまとめ、メソッド名も短くいたしました。
cbead86 to
1025a12
Compare
|
@komagata |

Issue
概要
変更確認方法
country_codeとsubdivision_code』に空文字列のデータがないため(テストデータに設定がない場合はnilで保存されている)です。nilとなるため、テストデータでは用意せずに変更確認方法1の手順で手動で作成する手順としております。変更確認方法1:本番環境のデータベース更新の動作確認
mainブランチでforeman start -f Procfile.devでローカル環境を立ち上げる。rails cを実行してコンソールを立ち上げる。1.
User.where(email: 'hatsuno@fjord.jp')を入力し、country_codeとsubdivision_codeに空文字列が保存されていることを確認する。2.
User.where(email: 'hajime@fjord.jp')を入力し、country_codeには選択した国のコード、subdivision_codeには空文字列が保存されていることを確認する。3.
User.where(email: 'komagata@fjord.jp')を入力し、country_codeとsubdivision_codeにそれぞれ以下のコードが保存されていることを確認する。bug/fix-empty-string-for-country-code-and-subdivision-codeをローカルに取り込む。git fetch origin bug/fix-empty-string-for-country-code-and-subdivision-codegit checkout bug/fix-empty-string-for-country-code-and-subdivision-code11.
rake data:migrate:up VERSION=20250314075905を実施する。db/data/20250314075905_convert_blank_of_country_code_and_subdivision_code_to_nil.rbのupメソッドをローカル環境で実施するコマンド。gem data-migrateで実施する。ローカル環境では上記のコマンドで動作確認をする。Wikicountry_codeとsubdivision_codeが正しくnilに変更されていることを確認するUser.where(email: 'hatsuno@fjord.jp')はどちらもnilUser.where(email: 'hajime@fjord.jp')はsubdivision_codeだけがnilUser.where(email: 'komagata@fjord.jp')は変更なし。変更確認方法2:登録情報の
country_codeとsubdivision_codeの保存時に未登録の場合はnilが保存される動作確認bug/fix-empty-string-for-country-code-and-subdivision-codeをローカルに取り込む。(既に済の場合は省略)git fetch origin bug/fix-empty-string-for-country-code-and-subdivision-codegit checkout bug/fix-empty-string-for-country-code-and-subdivision-codeforeman start -f Procfile.devでローカル環境を立ち上げる。rails cを実行してコンソールを立ち上げる。country_codeとsubdivision_codeに登録情報が設定されていることを確認する。ブラウザで登録情報変更ページから『お住まいの地域(都道府県・州まで)』で『登録しない』を選択し、画面下にある『更新する』ボタンをクリックする。

再度コンソール上で

User.where(email: 'komagata@fjord.jp')を入力し、country_codeとsubdivision_codeにnilが保存されていることを確認する。ブラウザで右上のユーザアイコンをクリック後に『登録情報変更』をクリックし『登録情報変更』ページへアクセスする。
『お住まいの地域(都道府県・州まで)』で『登録する』を選択し、『国』だけ選択し『都道府県・州』は『選択してください』のまま画面下にある『更新する』ボタンをクリックする。

コンソール上で

User.where(email: 'komagata@fjord.jp')を実行し、country_codeには選択した国のコード、subdivision_codeにはnilが保存されていることを確認する。ブラウザで右上のユーザアイコンをクリック後に『登録情報変更』をクリックし『登録情報変更』ページへアクセスする。
『お住まいの地域(都道府県・州まで)』で『登録する』を選択し、『国』と『都道府県・州』を選択して画面下にある『更新する』ボタンをクリックする。

コンソール上で

User.where(email: 'komagata@fjord.jp')を実行し、country_codeには選択した国のコード、subdivision_codeには選択した都道府県・州のコードが保存されていることを確認する。Screenshot
変更前:コンソール上で確認(画面の変更はなし)
country_codeとsubdivision_codeが共に未登録の場合はともに空文字列country_codeだけ登録、subdivision_codeは未登録の場合はsubdivision_codeだけ空文字列変更後:コンソール上で確認(画面の変更はなし)
country_codeとsubdivision_codeが共に未登録の場合はともにnilcountry_codeだけ登録、subdivision_codeは未登録の場合はsubdivision_codeだけnil