Skip to content
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

Discordのmentorチャンネルに提出物の溜まり具合を定期的に投稿する #2568

Merged

Conversation

gallardo16
Copy link
Contributor

@gallardo16 gallardo16 commented Apr 7, 2021

issue

#2399

概要

何故この機能が必要なのか

提出物は1週間以内にレビューする、というSLAになっているが、ときどきSLAを超えてしまいそうな提出物がぽろぽろ出てくる。
しかし、メンターが意識的にその情報を見に行かないと、そういう提出物があることに気づけない。
なので、PULL型ではなくPUSH型で情報が届くようにする。

機能の説明

毎日決まった時間に締切が近い提出物の件数をSlackのmentorチャンネルに投稿する。

  • 投稿内容の案
(提出後日数が経っている提出物)

- 5日経過 = 12件
- 6日経過 = 5件
- 7日以上経過 = 2件(OUT!!)

https://bootcamp.fjord.jp/products/not_responded
  • 該当する提出物が1件もない場合
(提出後日数が経っている提出物)

5日以上経過している提出物は1件もありません!🎉

https://bootcamp.fjord.jp/products/not_responded

このissueの進捗について

私(@gallardo16)の担当としては「JSON APIで未返信の提出物のうち5日、6日、7日以上経ったものの数をそれぞれ取得する」まで行いました。(2e815b3)
後の「Discordに通知する」に関しては駒形さんにお願いする形になります。

@komagata
Copy link
Member

komagata commented Apr 7, 2021

📝 基本的には今の感じでOK。(JSON APIができたところで完了にします〜)

@gallardo16
Copy link
Contributor Author

@komagata
了解です。コメントありがとうございます。

@gallardo16 gallardo16 force-pushed the feature/notification_of_products_count_close_to_deadline branch from 23f574d to 94fb50e Compare April 7, 2021 14:18
@gallardo16
Copy link
Contributor Author

@alto-I
お手隙の際に、コードレビューをよろしくお願いいたします🙇‍♂️

@gallardo16 gallardo16 requested a review from alto-I April 9, 2021 06:29
Copy link
Contributor

@alto-I alto-I left a comment

Choose a reason for hiding this comment

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

@gallardo16
自分の分かる範囲でですが問題ないのではと思います!😄

あと質問なのですが、これはテストは書いた方がいいissueなのでしょうか?
経験不足でテストが必要かどうかの判断付かなかったです…😥

@gallardo16 gallardo16 force-pushed the feature/notification_of_products_count_close_to_deadline branch from 94fb50e to 58a4782 Compare May 21, 2021 13:05
@gallardo16
Copy link
Contributor Author

@alto-I
返信が遅れてしましました。大変申し訳ありません。

レビューありがとうございます。

あと質問なのですが、これはテストは書いた方がいいissueなのでしょうか?

テストを追加しましたので再度レビューをよろしくお願いします🙇‍♂️

Copy link
Contributor

@alto-I alto-I left a comment

Choose a reason for hiding this comment

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

@gallardo16
こちらこそ遅くなってすいません!
テストも書いていただきありがとうございます😄
大丈夫だと思います!

practice: practice1
user: kimura
body: テストの提出物2です。
created_at: <%= Time.current - 1.day %>
updated_at: <%= Time.current - 1.day %>
published_at: <%= Time.current - 1.day %>
Copy link
Contributor

Choose a reason for hiding this comment

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

これは ago を使うと短く書けます。

  created_at: <%= 1.day.ago %>
  updated_at: <%= 1.day.ago %>
  published_at: <%= 1.day.ago %>

Copy link
Contributor Author

Choose a reason for hiding this comment

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

レビューありがとうございます。
修正してみます!

Comment on lines 8 to 19
@products_submitted_just_5days_count = 0
@products_submitted_just_6days_count = 0
@products_submitted_over_7days_count = 0
products.each do |product|
if product.submitted_just_specific_days(5)
@products_submitted_just_5days_count += 1
elsif product.submitted_just_specific_days(6)
@products_submitted_just_6days_count += 1
elsif product.submitted_over_specific_days(7)
@products_submitted_over_7days_count += 1
end
end
Copy link
Contributor

@sinsoku sinsoku May 24, 2021

Choose a reason for hiding this comment

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

モデルに経過日数を返すメソッドを用意して、 Array#count を使う実装にするのはどうでしょう?
ActiveSupport::Duration.build は経過した時間を計算できるクラスです。

# 公開日もしくは作成日からの経過日数を返す。
def elapsed_days
  t = published_at || created_at
  ActiveSupport::Duration.build(Time.current - t).parts[:days]
end

コントローラー側の処理がこんな感じでシンプルになる。

@products_submitted_just_5days_count = products.count { |product| product.elapsed_days == 5 }
@products_submitted_just_6days_count = products.count { |product| product.elapsed_days == 6 }
@products_submitted_over_7days_count = products.count { |product| product.elapsed_days >= 7 }

Copy link
Contributor Author

Choose a reason for hiding this comment

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

確かにシンプル!!
提案していただいた形で修正したいと思います。

Copy link
Member

Choose a reason for hiding this comment

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

@sinsoku レビューありがとうございます!

Copy link
Contributor

Choose a reason for hiding this comment

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

@gallardo16 @komagata
今回のケースだとあまり問題にならないと思いますが、変更後のコードは each が3回呼ばれる(countは内部で each を呼ぶ)点には注意が必要です。

業務のコードだと、こういう変更で意図せずパフォーマンスの劣化が起きて問題になるケースもあるため、補足のコメントもしておきます。

元のコード

products.each do |product|
  # productsの件数が100件の場合、中の処理は100回実行される。
end

変更後のコード

# productsの件数が100件の場合、合計で300回の処理が実行される。
products.count { |product| product.elapsed_days == 5 }
products.count { |product| product.elapsed_days == 6 }
products.count { |product| product.elapsed_days >= 7 }

Copy link
Contributor Author

Choose a reason for hiding this comment

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

@sinsoku
レビューありがとうございました。
提案していただいた形で修正したのですが上手くいかなかったので質問があります。

products.count { |product| product.elapsed_days == 5 }

上記の様に5日経過したものだけをカウントしたかったのですが、「12日経過したもの」もカウントされてしまいます。色々試した結果、12日経過したものは{:weeks=>1, :days=>5}(1週間と5日)で判定されているのかなと考えました。

そのため以下のようにメソッド等追加しました。

  def elapsed_days
    t = published_at || created_at
    ActiveSupport::Duration.build(Time.current - t).parts[:days]
  end

  def elapsed_weeks
    t = published_at || created_at
    ActiveSupport::Duration.build(Time.current - t).parts[:weeks]
  end
    @products_submitted_just_5days_count = products.count { |product| product.elapsed_days == 5 && product.elapsed_weeks.nil? }
    @products_submitted_just_6days_count = products.count { |product| product.elapsed_days == 6 && product.elapsed_weeks.nil? }
    @products_submitted_over_7days_count = products.count { |product| product.elapsed_weeks.to_i >= 1 }

提案していただいたコードで詰まってしまい、色々付け足してしまいました。
どうすればいいかわからなくなってしまったので、ご助言いただけたらなと思います。よろしくお願いいたします。

Copy link
Contributor

Choose a reason for hiding this comment

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

@gallardo16
{:weeks=>1, :days=>5} で返ってくるのは気づきませんでした 🙈

elapsed_days で経過日数を返すように直して、 elapsed_weeks などは作らない方が良いかなと思います。
weeksの扱いが微妙なので ActiveSupport::Duration を使わず、 ((Time.current - t) / 1.day).to_i で日数を出す方法にするとどうでしょうか?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

ありがとうございます。
修正できました。

@gallardo16
Copy link
Contributor Author

@alto-I
レビューありがとうございました。

@gallardo16 gallardo16 force-pushed the feature/notification_of_products_count_close_to_deadline branch from 58a4782 to 0a3aca0 Compare May 28, 2021 06:54
@gallardo16
Copy link
Contributor Author

@komagata
コードレビューをよろしくお願いいたします。

Copy link
Member

@komagata komagata left a comment

Choose a reason for hiding this comment

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

確認しました、OKですー🙆‍♂️

ありがとうございます!

@komagata komagata assigned komagata and gallardo16 and unassigned gallardo16 and komagata May 31, 2021
@komagata komagata force-pushed the feature/notification_of_products_count_close_to_deadline branch from 0a3aca0 to 65b738e Compare July 13, 2021 13:34
@komagata komagata merged commit d4e1705 into main Jul 15, 2021
Sign up for free to 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.

4 participants