質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

1回答

1097閲覧

予約一覧表をuserそれぞれで予約の有無を反映させたいです。

Shuno

総合スコア5

Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2021/06/30 17:30

前提・実現したいこと

user同士でお互いに予約を申請できるアプリを作成しております。
しかし、userそれぞれで予約の有無を反映させたいのですが、
予約が一つのテーブルに反映されている状況です。
つまり、user1とuser2に関係するものが、関係のないuser3にも予約のデータが表示されてしまいます。

該当のソースコード

app/controllers/reservations_controller.rb

class ReservationsController < ApplicationController before_action :logged_in_user def index @user = User.find(params[:user_id]) @reservations = Reservation.all.where("day >= ?", Date.current).where("day < ?", Date.current >> 3).order(day: :desc) end def new @user = User.find(params[:user_id]) @reservation = Reservation.new @day = params[:day] @time = params[:time] @start_time = DateTime.parse(@day + " " + @time + " " + "JST") end def show @reservation = Reservation.find(params[:id]) end def create @reservation = Reservation.new(reservation_params) if @reservation.save flash[:success] = "ビデオ通話予約しました" redirect_to reservation_path @reservation.id else render :new end end private def reservation_params params.require(:reservation).permit(:day, :time, :user_id, :from_user_id, :start_time) end end

app/helpers/reservations_helper.rb

module ReservationsHelper def times times = ["9:00", "9:30", "10:00", "10:30", "11:00", "11:30", "12:00", "12:30", "13:00", "13:30", "14:00", "15:00", "15:30", "16:00", "16:30"] end def check_reservation(reservations, day, time) result = false reservations_count = reservations.count # 取得した予約データにdayとtimeが一致する場合はtrue,一致しない場合はfalseを返す if reservations_count > 1 reservations.each do |reservation| result = reservation[:day].eql?(day.strftime("%Y-%m-%d")) && reservation[:time].eql?(time) return result if result end elsif reservations_count == 1 result = reservations[0][:day].eql?(day.strftime("%Y-%m-%d")) && reservations[0][:time].eql?(time) return result if result end return result end end

app/models/reservation.rb

class Reservation < ApplicationRecord belongs_to :user validates :user_id, presence: true validates :from_user_id, presence: true validates :day, presence: true validates :time, presence: true validates :start_time, presence: true, uniqueness: true def self.reservations_after_one_month # 今日から1ヶ月先までのデータを取得 reservations = Reservation.all.where("day >= ?", Date.current).where("day < ?", Date.current >> 1).order(day: :desc) # 配列を作成し、データを格納 # DBアクセスを減らすために必要なデータを配列にデータを入れる reservation_data = [] reservations.each do |reservation| reservations_hash = {} reservations_hash.merge!(day: reservation.day.strftime("%Y-%m-%d"), time: reservation.time) reservation_data.push(reservations_hash) end reservation_data end end

app/views/reservations/index.html.erb

<% provide(:title, "#{@user.name}さんの予約一覧") %> <section id="contact" class="contact section-bg login"> <div class="container"> <div class="row"> <div class="col-12 text-center"> <h2><%= @user.name %>さんの予約一覧</h2> <p>1ヶ月先まで予約することができます。</p> </div> <div class="col-12 mt-3"> <%= week_calendar events: @reservations do |date, reservations| %> <%= date.day %> <% end %> </div> </div> </div> </section>

app/views/simple_calendar/_week_calendar.html.erb

<div class="container"> <div class="row"> <div class="simple-calendar"> <div class="calendar-heading"> <%= link_to t('simple_calendar.previous', default: '前週'), calendar.url_for_previous_view %> <% if calendar.number_of_weeks == 1 %> <span class="calendar-title"><%= t('simple_calendar.week', default: '1週間') %></span> <% else %> <span class="calendar-title"><%= t('simple_calendar.week', default: '1週間') %></span> <% end %> <%= link_to t('simple_calendar.next', default: '翌週'), calendar.url_for_next_view %> <% reservations = Reservation.reservations_after_one_month %> </div> <table class="table table-striped"> <thead> <tr> <th>時間</th> <% date_range.slice(0, 7).each do |day| %> <th><%= t('date.abbr_day_names')[day.wday] %></th> <% end %> </tr> </thead> <tbody> <% date_range.each_slice(7) do |week| %> <tr> <td></td> <% week.each do |day| %> <%= content_tag :td, class: calendar.td_classes_for(day) do %> <% if defined?(Haml) && respond_to?(:block_is_haml?) && block_is_haml?(passed_block) %> <% capture_haml(day, sorted_events.fetch(day, []), &passed_block) %> <% else %> <% passed_block.call day, sorted_events.fetch(day, []) %> <% end %> <% end %> <% end %> </tr> <% times.each do |time| %> <tr> <td><%= time %></td> <% week.each do |day| %> <td> <% if check_reservation(reservations, day, time) || day <= Date.current || (Date.current >> 1) < day %> <%= '×' %> <% else %> <%= link_to new_reservation_path(day: day, time: time, user_id: @user.id) do %> <%= '○' %> <% end %> <% end %> </td> <% end %> </tr> <% end %> <% end %> </tbody> </table> </div> </div> </div>

試したこと

下記のリンクを参考にしながら、作成しています。
リンク

app/views/simple_calendar/_week_calendar.html.erb の42行目とapp/helpers/reservations_helper.rb あたりが怪しいなと思っております。

補足情報(FW/ツールのバージョンなど)

rubyのバージョンは2.6.7です。
必要な箇所があれば載せますのでご教授お願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

@reservations = Reservation.all. where("day >= ?", Date.current). where("day < ?", Date.current >> 3).order(day: :desc)
ですと、誰の予定か、という制約が無いためです。
「だれの」を表示したいのか、により変わりますが、例えばlogin者が立てたものと受けたものを表示するなら、
where("user_id = ? or from_user_id = ?",[current_user.id,current_user.id])
を追加してください

投稿2021/06/30 22:37

winterboum

総合スコア23567

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Shuno

2021/07/05 12:02

返信遅くなって申し訳ございません。 ご回答くださり、ありがとうございます。 ``` where("user_id = ? or from_user_id = ?", current_user.id, current_user.id) ``` を追加したところ、まだすべての予約が反映されています。 login者がuser1の予約一覧を表示すると、関係のないuser2とuser3同士の予約は反映されないようにするにはどうすればいよいでしょうか?
winterboum

2021/07/05 13:38

どういう式にしたのか載せて
Shuno

2021/07/06 12:48

def index @user = User.find(params[:user_id]) @reservations = Reservation.where("day >= ?", Date.current).where("day < ?", Date.current >> 3).order(day: :desc).where("user_id = ? or from_user_id = ?", @user.id, current_user.id) end こちらの式です。 よろしくお願いいたします。
winterboum

2021/07/06 13:48

user1の予約一覧を表示する のでしたら `@user.id, current_user.id` ではなく`@user.id, @user.id` ですね
Shuno

2021/07/07 10:39

ご回答ありがとうございます。 SQL文をいろいろ変えてみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問