ume

rails gem simple_calendarで2つのテーブルからデータを取得しカレンダーに表示する

初めに

simple_calendarというgemをオリジナルアプリ(目標管理アプリ)に導入した際、カレンダーに1つのテーブルからデータを取得、表示するといったqiita記事はよく見かけたのですが「2つのテーブルからそれぞれデータを取得しカレンダーに表示させる」といった記事が見当たらなかったので記事に残します。

完成物

カレンダー内のドロップダウンから週間目標かタスクが登録でき、それぞれのテーブルからデータを取得しカレンダー内に表示する

今回3つのテーブルがあります。 UserテーブルとWeeklyGoalテーブルとTaskテーブル、 1人のUserが複数のWeeklyGoalを持ち1つのWeeklyGoalが複数のTaskを持っています。

全体像

  1. WeeklyGoalテーブルからユーザーに紐ずく週間目標を取得.

  2. 空の配列に週間目標を格納する.

  3. Taskテーブルから週間目標に紐ずくタスクを取得する

  4. 空の配列にタスクを格納する.

  5. 週間目標とタスクが入った配列を@eventsに代入する.

  6. @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
 ```