#はじめに
Simplecalendarというgemを使用して表示したカレンダー内に、スケジュール情報を表示させる際、苦労しましたので備忘録として残します。
よろしければ参考にしてください。
#SimpleCalendarとは
viewにコードを記述することにより、カレンダーを表示させる gemです。詳しくは下記URLをご覧ください。
参考:http://excid3.github.io/simple_calendar/
##カレンダー内に、meetingモデル内のすべてのレコードを表示させる
これは、参考URLのままでうまくいきました。
※Meetingモデルはscaffoldを用いて作成
<%= month_calendar events: @meetings do |date, meetings| %>
<%= date %>
<% meetings.each do |meeting| %>
<div>
<%= meeting.name %>
</div>
<% end %>
<% end %>
def show
@meetings = Meeting.all
end
##meetingモデル内の指定ユーザのレコードを表示
find_byメソッドでは、レコードが1件しか取得できないため、whereメソッドを使用。
※meetingモデルには、useridカラムを追加しました。
def show
@meetings = Meeting.where(userid: params[:id])
end
##上記のレコードに加え、[指定ユーザーと相互フォロー状態にあるユーザー]のレコードを表示
ここで苦労しました。
①インスタンス@meetingsに「指定ユーザー」のスケジュールを代入
②「①で作成したインスタンス@meetings」に対し、「指定ユーザーと相互フォロー状態にあるユーザー」のスケジュールを追加
上記の流れでコーディングを進めましたが、下記の問題が発生しました。
・pushメソッドでデータを追加しようとしたがうまくいかない。
原因は2つありました。
・whereメソッドの戻り値はActiveRecord_Relationのインスタンスなので、Arrayクラスのメソッドであるpushメソッドは使用できない。
→to_aryメソッドを用いてArrayクラスに変換することにより解決。
・to_aryメソッドにより変換したインスタンスは「freezeプロパティがtrue」となっているため、編集が効かない。
→dupメソッドを用いて、コピーを作成することにより解決。
def show
#[表示しているユーザー]のMeetingモデルのレコードを取得
@meetings = Meeting.where(userid: params[:id]).to_ary().dup()
#[表示しているユーザーと相互フォロー状態にあるユーザー]のMeetingモデルのレコードを追加
relationships_each(params[:id]).each do |relation|
tmp = Meeting.where(userid: relation).to_ary
tmp.each do |record|
@meetings.push(record)
end
end
end
private
def relationships_each(userid)
#[指定されたidのユーザー]と相互フォロー状態にあるユーザーの一覧を配列形式で返す
relationships_follower = Relationship.where(follower_id: userid).pluck(:followed_id)
Relationship.where(followed_id: userid).where(follower_id: relationships_follower).pluck(:follower_id)
end
参考URL:
https://qiita.com/7coco/items/b08c842aece4b7f28f55
https://qiita.com/tsuchinoko_run/items/f3926caaec461cfa1ca3
https://qiita.com/iwamot/items/2ddf8de09d5dbcad2df9