初めに
simple_calendarというgemをオリジナルアプリ(目標管理アプリ)に導入した際、カレンダーに1つのテーブルからデータを取得、表示するといったqiita記事はよく見かけたのですが「2つのテーブルからそれぞれデータを取得しカレンダーに表示させる」といった記事が見当たらなかったので記事に残します。
完成物
カレンダー内のドロップダウンから週間目標かタスクが登録でき、それぞれのテーブルからデータを取得しカレンダー内に表示する
今回3つのテーブルがあります。 UserテーブルとWeeklyGoalテーブルとTaskテーブル、 1人のUserが複数のWeeklyGoalを持ち1つのWeeklyGoalが複数のTaskを持っています。
全体像
WeeklyGoalテーブルからユーザーに紐ずく週間目標を取得.
空の配列に週間目標を格納する.
Taskテーブルから週間目標に紐ずくタスクを取得する
空の配列にタスクを格納する.
週間目標とタスクが入った配列を@eventsに代入する.
@eventsをviewでif文を使用し表示する。
コード
まずコントローラー.rbでデータを取得
def my_goal @weekly_goals = @user.weekly_goals #ユーザーに紐ずく週間目標を取得 @events = @user.collect_user_events(@weekly_goals) #自作メソッド(collect_user_events())で@eventsの中に週間目標とタスクを代入 end
model.rbファイル内でcollect_user_events()メソッドを定義します
def collect_user_events(user_weekly_goals) events = [] user_weekly_goals.each do |weekly_goal| events.push(weekly_goal) weekly_goal.tasks.each do |task| events.push(task) end end events end
my_goal.html.slim(このファイルでカレンダーの表示と週間目標とタスクを表示しています)
= month_calendar attribute: :start_time, end_attribute: :end_time,events: @events do |date, events| = date.day 省略 - events.each do |event| - if event.is_a?(WeeklyGoal) #配列内の中の要素(週間目標とタスク)を一つずつ取り出し週間目標とタスクを区別する div.container p[class = "weekly_goal_link_#{event.id}"] = link_to event.weekly_goal , '#',class: "weekly_goal_display_#{event.id}", data: { date: event.start_time.to_s, content: event.weekly_goal } p = link_to "編集", '#' , class: "weekly_goal_edit_#{event.id}",data: { id: event.id } p = link_to "削除", '#' , class: "weekly_goal_destroy_#{event.id}" - else div = link_to event.task,event ```