Modelを考えていきたいと思う
#締め切りカレンダー
hr.icon
code:必要そうな要素
Event # イベント・募集そのもの(KC3Hack、Google STEPなど)
Deadline # Eventが持つ締切日
Entry # ユーザーがEventに対して持つ応募記録
User # 使う人
code:関係性
User has_many :entries
Event has_many :deadlines
has_many :entries
Entry belongs_to :user
belongs_to :event
Deadline belongs_to :event
code:全テーブルカラム
# Userテーブル
create_table :users do |t|
t.string :name, null: false
t.string :email, null: false
t.string :encrypted_password, null: false
t.datetime :last_login_at
t.datetime :last_login_at_prev # 更新前の値を保持
t.timestamps
end
# Eventテーブル
create_table :events do |t|
t.string :title, null: false
t.integer :category, null: false # enum
t.string :source_url
t.string :organizer
t.date :event_at # イベント当日
t.text :notes
t.boolean :is_personal, default: false # 自分用フラグ
t.timestamps
end
# Deadlineテーブル
create_table :deadlines do |t|
t.references :event, null: false, foreign_key: true
t.date :deadline_at, null: false
t.string :label # "一次締切"など任意ラベル
t.datetime :changed_at # バッチが変更検知した時刻
t.date :deadline_at_prev # 変更前の締切日
t.timestamps
end
# Entryテーブル
create_table :entries do |t|
t.references :user, null: false, foreign_key: true
t.references :event, null: false, foreign_key: true
t.integer :status, null: false, default: 0 # enum
t.text :notes
t.timestamps
end
deviseのカラムに追加
t.string :provider # "google_oauth2"
t.string :uid # GoogleのユーザーID
t.string :avatar_url # プロフィール画像(サイネージで使える)
code:enumの中身
# Event
enum category: {
intern: 0,
hackathon: 1,
event: 2,
personal: 3
}
# Entry
enum status: {
todo: 0,
drafting: 1,
submitted: 2,
skipped: 3,
auto_closed: 4 # バッチが応募終了を検知した時
}
encrypted_passwordはOIDCだけにするなら不要にできますが、一応残しておくのが無難です。
これで設計がほぼ確定しました。全体を一回整理しましょうか。
✅ モデル設計(User/Event/Deadline/Entry)
✅ 認証(OIDC / Google)
✅ URL解析(ボタン押下時 + Claude API)
✅ 深夜バッチ(Sidekiq + whenever)
✅ 残り日数(動的計算)
✅ サイネージ(/signageページ)