ゴール
連続で投稿した場合はカウントが1増え続けて、投稿日が空いた場合はカウントが1に戻る機能を実装していきます。
開発環境
tweetsController,TweetModel,tweetsテーブル,UserModel,usersテーブル
GeekSalonの教材5-2まで完了していることを前提にしています。
事前準備
usersテーブルにkaisuuカラム(連続投稿回数を記録するためのカラム)とlast_tweeted_date(最後にツイートした日を保存するためのカラム)を追加してもらいます。
rails generate migration AddKaisuuToUsers kaisuu:integer
#usersテーブルにkaisuuカラム(連続投稿回数を記録するためのカラム)を追加
rails generate migration AddLast_tweeted_dateToUsers last_tweeted_date:date
#sersテーブルにlast_tweeted_date(最後にツイートした日を保存するためのカラム)を追加
rails db:migrate
#マイグレーションを実行
実装
tweetモデルに以下のコードを記入してください。
class Tweet < ApplicationRecord
belongs_to :user
after_create :renzoku_hantei
#投稿を作成したのちにrenzoku_hanteiを実行する。
#↓がrenzoku_hanteiの中身
private
def renzoku_hantei
puts "始まったよー!!"
user = self.user
today = created_at.to_date
last_date = user.last_tweeted_date
return if last_date == today
#user.last_tweeted_dateがcreated_at.to_dateと同じならカウントしない。同日に複数投稿してる場合にこの後の処理を全部なしにする。
puts "同日投稿判定を潜り抜けたよ!"
if last_date == today - 1
#user.last_tweeted_date(前回投稿した日)がcreated_at.to_date(投稿した日)より1低かったら(:例16日に投稿、前回の投稿は15日)なら、
new_kaisuu = user.kaisuu.to_i + 1
puts "回数が増えたよ!"
else
puts "1回目だよ!"
new_kaisuu = 1
end
# 回数にファイナル回数を代入、last_tweeted_date(前回投稿日)にtoday(今日の日付)を代入。
user.update!(
kaisuu: new_kaisuu,
last_tweeted_date: today
)
end
end
今回は実装がうまく行っているかどうかのテストのためにputsを用いてそれぞれの分岐で文章を出力させています。
うまく行っているかのテストの仕方
チェックしたい人はここをクリック!
普通に投稿してテストをやろうとすると、created_atとupdated_atを設定できないので1回テストをするだけで2日かかってしまいます。そこでrails cをしてコンソールから直接投稿をしていくことにします。
rails c
u = User.create!(name: "test_user", email:"あなたのメールアドレス", password:"お好きなパスワードを入れてください", kaisuu: 0, last_tweeted_date: nil)
#新しいユーザーを作成してuに代入する。
u = User.first
#user_idが1のプレイヤーをuに代入する。
#注意!上のuにユーザーを代入する作業はどちらか1回で行ってください!
u.sindans.create!(name: "iti", created_at: Date.new(2025, 4, 16), updated_at: Date.new(2025, 4, 16))
#1個目のテスト投稿。created_atとupdated_atはテストをする日の日付に合わせてください
u.reload.kaisuu
#kaisuuカラム(連続投稿回数を記録するためのカラム)の中身を出力、これを押した時にputsが出力される。
u.sindans.create!(name: "ni", created_at: Date.new(2025, 4, 17), updated_at: Date.new(2025, 4, 17))
#2個目のテスト投稿。created_atとupdated_atはテストをする日の次の日付に合わせてください
u.reload.kaisuu
#kaisuuカラム(連続投稿回数を記録するためのカラム)の中身を出力、これを押した時にputsが出力される。
u.sindans.create!(name: "san", created_at: Date.new(2025, 4, 19), updated_at: Date.new(2025, 4, 19))
#3個目のテスト投稿。created_atとupdated_atは2個目の日付と連続していない日付に設定してください。
上の方法でテストを行った場合、「u.reload.kaisuu」を行うたびに「puts"○○"」によってどの分岐を通ったかがわかります。
下にフローチャートを示します。

回数が増える場合の分岐の表示
連続判定が無事始まったので1に「始まったよー!!」→同じ日に投稿した?で違う日に投稿しているので2に「同日投稿判定を潜り抜けたよ!」→前回投稿した日と今回投稿した日が連続かどうかを判定。連続しているので3に「回数が増えたよ!」が返ってくる。

1回目に戻る場合の分岐の表示
連続判定が無事始まったので1に「始まったよー!!」→同じ日に投稿した?で違う日に投稿しているので2に「同日投稿判定を潜り抜けたよ!」→前回投稿した日と今回投稿した日が連続かどうかを判定。連続していないので3に「1回目だよ!」が返ってくる。

view上で表示する
連続投稿回数を表示したいページ(今回の場合はtweetscontrollerを用いるページ)に以下の形で記入してください。
現在の連続投稿回数 <%= current_user.kaisuu %>回