前提
Ruby on Railsでレンタカーサイトのようなものを作っています。
その際、レンタル可能な車の一覧を返すscopeの作成がうまくいかないため、知恵をお借りしたいです。
実現したいこと
- 貸出日(start_day)と返却日(end_day)が与えられる
- その日程で借りることができるCarモデルのActiveRelationを返すscopeを作成したい
- 貸出日と返却日の間に一日でも借りられている車は上記ActiveRelationには含まれない
- ActiveRelationを返すことで、メソッドチェーンに対応する
発生している問題
RentStateというモデルを作成し、どの日程でどの車が借りられているか保存。
Car.allからレンタルされている車を引く形でレンタル可能な車を出すことは出来ましたが、その場合Arrayが返され、メソッドチェーンができない。
app/models/car.rb ------------------------------------------- Class Car < ApplicationRecord has_many :rent_states # 該当日程でレンタルされている一覧のscope scope :is_rent, ->(start_day, end_day) { includes(:rent_states).where(rent_states: { rent_day: start_day..end_day }).distinct } # 該当日程でレンタルできる一覧のscopeにしたいが、ActiveRelationではなく、配列が返ってしまう scope :rentable, -> (start_day, end_day) { Car.all - is_rent(start_day, end_day) } end ------------------------------------------- app/models/rent_state.rb Class RentState < ApplicationRecord belongs_to :car # rent_satesにはcar_idカラムとrent_dayカラムがあり、car_idに入っている車がレンタルされている日がrent_dayに入る。 # 二日間借りられた場合、RentStateが二つ作られる。 # 例: 2022/12/27〜2022/12/28までCar.firstが借りられた場合、car_id: 1, rent_day: 2022/12/27のRentStateとcar_id: 1, rent_day: 2022/12/28のRentStateが作られる。 end -------------------------------------------
補足情報(FW/ツールのバージョンなど)
Ruby on Rails 7.0.4
ruby 3.1.2
where、where.missing、except、notなどを駆使して希望の形にできないか色々試しましたがうまくいきませんでした。
データベース操作やデータベースの構成自体があまり得意ではなく、データベースの構成自体を変えたほうがいいなどあればご教授いただければ助かります。
お忙しいところ恐れ入りますが、よろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/12/28 14:13