0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

現在の連続投稿数を表示するための方法

Last updated at Posted at 2026-01-10

ゴール

連続で投稿した場合はカウントが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モデルに以下のコードを記入してください。

app/model/tweet.rb
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"○○"」によってどの分岐を通ったかがわかります。
下にフローチャートを示します。
スクリーンショット 2025-04-23 195828.png

回数が増える場合の分岐の表示

連続判定が無事始まったので1に「始まったよー!!」→同じ日に投稿した?で違う日に投稿しているので2に「同日投稿判定を潜り抜けたよ!」→前回投稿した日と今回投稿した日が連続かどうかを判定。連続しているので3に「回数が増えたよ!」が返ってくる。
スクリーンショット 2025-04-23 204121.png

1回目に戻る場合の分岐の表示

連続判定が無事始まったので1に「始まったよー!!」→同じ日に投稿した?で違う日に投稿しているので2に「同日投稿判定を潜り抜けたよ!」→前回投稿した日と今回投稿した日が連続かどうかを判定。連続していないので3に「1回目だよ!」が返ってくる。
スクリーンショット 2025-04-23 204229.png

view上で表示する

連続投稿回数を表示したいページ(今回の場合はtweetscontrollerを用いるページ)に以下の形で記入してください。

app/views/tweets/○○.html.erb
現在の連続投稿回数 <%= current_user.kaisuu %>
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?