-
Notifications
You must be signed in to change notification settings - Fork 71
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
担当者が決まってない提出物(未アサイン)の数をテキストで表示する #4136
Conversation
7932e26
to
425a72c
Compare
@AudioStakes お疲れ様です!こちらお手すきの際にレビューをお願いいたします 🙇 |
@kaisumi |
@AudioStakes 大丈夫です!よろしくお願いしますー 😄 |
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.
@kaisumi
ひとつだけコメントしました〜(途中なので、対応してもらわなくて大丈夫です。)
残りは来週月曜以降にレビューさせてください🙏
@products = Product | ||
.unassigned | ||
.unchecked | ||
.not_wip | ||
.list | ||
.order_for_not_wip_list | ||
@passed5 = @products.count { |product| product.elapsed_days == 5 } | ||
@passed6 = @products.count { |product| product.elapsed_days == 6 } | ||
@over7 = @products.count { |product| product.elapsed_days >= 7 } |
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.
ここでインスタンス変数にしている @products
は、app/views/api/products/unassigned_text/show.text.erb
で使われていないため、インスタンス変数にしなくても大丈夫そうですー
(追記)以下の修正案よりも、 Product モデルにメソッドを作るという修正案の方がより良いと思ったため、こちらの案は取り下げます。
※ 以降については、好みが分かれると思いますので修正は任意です
app/views/api/products/unassigned_text/show.text.erb
へ渡したいデータは、 elapsed_days
が 5, 6, もしくは 7以上の個数(カウント数)のみですね。
それらを次のように、一つの変数にまとめることができるのかなと思いました。どうでしょう?(かえって読みにくいかもしれません😅)
$ rails c
>> elapsed_days_hash = Product.unassigned.unchecked.not_wip.list.map(&:elapsed_days).map { |days| days >= 7 ? 'over7' : days }.tally
=> {1=>1, 5=>1, 6=>1, "over7"=>8, 0=>46}
>> elapsed_days_hash[5]
=> 1
>> elapsed_days_hash[6]
=> 1
>> elapsed_days_hash['over7']
=> 8
※ 変数名は例示用です。より適切な名前がありそうです。
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.
こちらについて以前コメントした内容について、 Product モデルにメソッドを作る方が良いと考え直しましたので、取り下げさせてください🙏
@kaisumi この PR のスコープ外だと思うものの、対処した方が良いのかもしれない(対処しなくても良いのかどうか僕がわかっていない)ことが下記2点あります。 提出後の経過日数として扱われる
|
def elapsed_days | |
t = published_at || created_at | |
((Time.current - t) / 1.day).to_i | |
end |
この計算式は、WIP (すなわち published_at
が nil
)の product は created_at
を基準に経過日数を返しています。たとえば、WIP のまま7日経過すると返り値は「7」です。これは「提出後7日経過」を示しているように見える(直感に反しているように思える)ため、WIP の場合は経過日数を返さない( nil
や -1
を返す?)などの修正をした方が良いかもしれない、と考えています。
一度提出した後に WIP へ戻し、その後に再び提出した場合「提出後の経過日数」は最初に提出した日時を起点に計算されている
次のとおり、提出した後に6日超えた提出物を WIP に戻し、その後に再提出しても6日超えたままです。
Screen.Recording.2022-02-08.at.10.06.04.mov
この場合、次のような予期しない事象が生じるかもしれません。
- (受講生が)操作を誤って提出してしまった
- (受講生が)WIP に戻した
- (受講生が)その7日後、完成した提出物を提出した(WIP ではない状態にした)
- (メンターが)メンター向けの提出物一覧画面を見ると、期限の7日を超えた提出物がいきなり現れた
@AudioStakes コメントありがとうございます 😄
|
@kaisumi
なるほど、わかりました👍
はい、もちろんです!
たしかに、そのように対応すると |
@AudioStakes
おっしゃる通りですね。それではIssueを立てて議論できる場を作りたいと思います。 |
@AudioStakes すみません先程の1.の件ですが、以下の部分で既に非WIPに絞っているので、ご指摘の箇所ではWIPの考慮は不要そうでした 👀
|
たしかに、現状は非 WIP に絞っているため |
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.
@kaisumi
変更内容を確認しました〜!
すでに動いている他の実装を参考にされたようで、基本的に要件が満たされているのかなと思いました👍
ただいくつか教えてほしいことやより良くできそうな箇所がありましたので、それらをコメントしました。ご確認お願いいたしますー🙏
@@ -0,0 +1,15 @@ | |||
# frozen_string_literal: true | |||
|
|||
class API::Products::UnassignedTextController < API::BaseController |
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.
新たなコントローラーを作成していますね。
他の方法として、既存の API::Products::UnassignedController
に新たなアクションを追加するという方法でも対応できそうに思いました。そのような対応にすることで、 Unassigned
に関係するアクションを一つのコントローラーにまとめることができて良さそうです。
PR の Description にある「.txtで表示させるために...コントローラーをunassignedとは分けています。」が新しいコントローラーを作成した(新たなアクションでは対応できない)理由でしょうか?
僕が何かわかっていないことがありそうな気がするため、教えてもらいたいですー🙏
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.
私も当初unassigned_controllerに統一しようとしていました。しかしそうするとindexの方もindex.txtを探してしまうようでエラーとなったので、コントローラーを分けてあります。
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.
routes の方でコメントしました collection を使う方法でアクションを追加をしますと、そのアクション名にしたがって探しにいく(たとえば count というアクション名であれば、count.txt を探しにいく)ようになりそうですー
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 'text.txt'
(そしてindexの方にrender 'index.json'
)を呼び出すことでコントローラーを統合できました!
.unassigned | ||
.unchecked | ||
.not_wip | ||
.list |
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.
list
は目的の product (提出後の経過日数が5日以上の product)を取得する条件には影響しないクエリ条件のように見えますー
bootcamp/app/models/product.rb
Lines 43 to 49 in 425a72c
scope :list, lambda { | |
with_avatar | |
.preload(:practice, | |
:comments, | |
{ user: :company }, | |
{ checks: { user: { avatar_attachment: :blob } } }) | |
} |
この条件なしでは目的の product を取得できないようでしたら、教えてほしいです🙏
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.
数のカウントのみなので、listは不要でした!ご指摘ありがとうございます 😄
.unchecked | ||
.not_wip | ||
.list | ||
.order_for_not_wip_list |
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.
order_for_not_wip_list
は目的の product (提出後の経過日数が5日以上の product)を取得する条件には影響しないクエリ条件のように見えますー
bootcamp/app/models/product.rb
Line 51 in 425a72c
scope :order_for_not_wip_list, -> { order(published_at: :desc, id: :desc) } |
この条件なしでは目的の product を取得できないようでしたら、教えてほしいです🙏
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 %> | ||
|
||
<% else %> | ||
提出されたから5日以上経過している提出物はありません。 |
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.
提出されたから5日以上経過している提出物はありません。 | |
提出されてから5日以上経過している提出物はありません。 |
タイポのようですー
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.
失礼しました 👀 修正しますー
@passed5 = @products.count { |product| product.elapsed_days == 5 } | ||
@passed6 = @products.count { |product| product.elapsed_days == 6 } | ||
@over7 = @products.count { |product| product.elapsed_days >= 7 } |
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.
※こちらの修正は任意でお願いします
この処理と似た処理が、他のコントローラーでも使われていますね。
bootcamp/app/controllers/api/products/passed_controller.rb
Lines 8 to 10 in 425a72c
@passed5 = products.count { |product| product.elapsed_days == 5 } | |
@passed6 = products.count { |product| product.elapsed_days == 6 } | |
@over7 = products.count { |product| product.elapsed_days >= 7 } |
Product モデルに次のようなメソッドを作り、コントローラーではそのメソッドを呼び出すようにすると良いのかなと思いました。
- 引数に products を受け取る
- 返り値として、経過日数が5日, 6日, 7日以上それぞれの個数をカウントした次のハッシュを返す
{'passed5': 1, 'passed6': 2, 'over7': 3}
※ passed5
や over7
は、単体で読むと何を示しているか想像できないということもありそうなので、「経過日数が5日」「経過日数が7日以上」ということをより具体的に表す名前にしても良いかもしれません。
※ もしこの修正をする場合、その作業量が大きいようでしたら新たな Issue として切り出し、そちらで対応した方が良いかもしれません。
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.
この処理と似たような処理が、いくつかのコントローラーで繰り返し使われていますね。
例として挙げたうちの以下2つは「経過日数x日のうちの最新の1件を取得」しているようで、個数はカウントしていませんでした(処理が異なっていました)。失礼しました🙇♂️
bootcamp/app/controllers/api/products/unassigned_controller.rb
Lines 12 to 14 in 425a72c
@latest_product_submitted_just_5days = @products.find { |product| product.elapsed_days == 5 } | |
@latest_product_submitted_just_6days = @products.find { |product| product.elapsed_days == 6 } | |
@latest_product_submitted_over_7days = @products.find { |product| product.elapsed_days >= 7 } |
bootcamp/app/controllers/api/products/unchecked_controller.rb
Lines 23 to 25 in 425a72c
@latest_product_submitted_just_5days = @products.find { |product| product.elapsed_days == 5 } | |
@latest_product_submitted_just_6days = @products.find { |product| product.elapsed_days == 6 } | |
@latest_product_submitted_over_7days = @products.find { |product| product.elapsed_days >= 7 } |
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.
コメントありがとうございます 😄
passedの方は、unassigned_textが動くようになったら削除することが検討されているので、現状では統合しないでおこうと思います 👍
@products = Product | ||
.unassigned | ||
.unchecked | ||
.not_wip | ||
.list | ||
.order_for_not_wip_list | ||
@passed5 = @products.count { |product| product.elapsed_days == 5 } | ||
@passed6 = @products.count { |product| product.elapsed_days == 6 } | ||
@over7 = @products.count { |product| product.elapsed_days >= 7 } |
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.
こちらについて以前コメントした内容について、 Product モデルにメソッドを作る方が良いと考え直しましたので、取り下げさせてください🙏
@products = Product | ||
.unassigned | ||
.unchecked | ||
.not_wip |
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.
※修正は任意でお願いします
目的の product (提出後の経過日数が5日以上の product)以外の product を除くため、クエリ条件に「提出してから5日以上経過した」という条件も追加できたら良さそうだなーと思いました。
Product モデルに「提出してからx日以上経過した」というクエリ条件のスコープを作ってみても良いかもしれません。
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.
いいですね!修正してみようと思います 😄
config/routes/api.rb
Outdated
@@ -54,6 +54,7 @@ | |||
namespace :products do | |||
resources :unchecked, only: %i(index) | |||
resources :unassigned, only: %i(index) | |||
resource :unassigned_text, only: %i(show), controller: 'unassigned_text' |
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.
コントローラーの方へコメントした内容と同様に、こちらも新たな resource を追加せず unassigned
に新たなアクションを追加した方が良いのかな、と考えていますー
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.
unassignedに新たなアクションを追加すると生成されるルートが/unassigned/:id
となり、パラメータ不足でエラーになってしまうため、resourceで記載を分ける必要がありました。
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.
なるほど、試行錯誤された上での判断だったのですね!説明ありがとうございます。
生成されるルートが/unassigned/:idとなり、パラメータ不足でエラーになってしまう
Rails ガイドの コレクションルーティングを追加する を参考に次のようにしますと、 :id
のパラメーターなしで新たなアクションを追加できるようですー
期待されている振る舞いと何か違うところがありましたら、教えてください🙏
resources :unassigned, only: %i(index) do
get 'count', on: :collection
end
$ rails routes | grep api_products_unassigned
count_api_products_unassigned_index GET /api/products/unassigned/count(.:format) api/products/unassigned#count
api_products_unassigned_index GET /api/products/unassigned(.:format) api/products/unassigned#index
api_products_unassigned_text GET /api/products/unassigned_text(.:format) api/products/unassigned_text#show
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.
ありがとうございます!:id
なしでルーティングできました 😄
@AudioStakes コメントありがとうございます 😄
おっしゃる通り、WIPかどうか迷った時点で改善の余地はありますね。機能の不具合にはなっていないのでバグではなく新機能でコードを整理する必要があるかもしれません。 レビューありがとうございました! |
0c42ce0
to
8349d3f
Compare
@AudioStakes 修正終わりましたので再レビューよろしくお願いします 😄 |
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.
修正ありがとうございますー!OKです👍
@passed5 = products.count { |product| product.elapsed_days == 5 } | ||
@passed6 = products.count { |product| product.elapsed_days == 6 } | ||
@over7 = products.count { |product| product.elapsed_days >= 7 } | ||
render 'counts.txt' |
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.
以下、調べてわかったことをお伝えします。現状でも動いてますので、修正不要です!
View ファイルを counts.txt.erb
ではなく counts.text.erb
とすることで、この render の指定はなくても動くようでしたー
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.
@AudioStakes レビューありがとうございました 😄
counts.text
で動くのですね!ありがとうございます 🎉
renderの記述は違和感があるので修正しようと思います。
30bed2f
to
bb8245b
Compare
@komagata お疲れ様です!こちらお手すきの時にレビューをお願いいたします 🙇 |
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.
確認しました、OKですー🙆♂️
Issue: #3897
概要
すでに未確認の提出物のうち提出日から5日、6日、7日以上が経過した提出物の数をDiscordのメンターチャンネルに投稿するためのAPIがある。今回はその対象を未アサインかつ未確認の提出物としたAPIを実装した。
注意点
.txtで表示させるために:ルーティングをresourcesではなくresourceにしています。コントローラーをunassignedとは分けています。