Offer
の番号はplaces
です。それは、毎日places
予約がこのオファーのために作ることができることを意味します。 Offer
has_many
予約。2つの日付間の予約が可能かどうかを確認する方法
A Booking
はdate_begin
、date_end
とbelongs_to
Offer
を有しています。つまり、対応するOffer
に関しては、date_begin
とdate_end
の間の1日が使用されます。
オファーのリクエストがあった場合、そのオファーを確認するにはどうすればよいですか?
例:ここでは
- offer has 2 places (offer.places == 2).
- offer has currently 3 bookings (offer.bookings.count == 3)
- First booking B1 is between 01-04-2016 and 10-04-2016
- Second booking B2 is between 01-04-2016 and 05-04-2016
- Third booking B3 is between 08-04-2016 and 10-04-2016.
offer.available_between?("01-04-2016", "10-04-2016")
=> false (because of B1 and B2, and because of B1 and B3)
offer.available_between?("01-04-2016", "05-04-2016")
=> false (because of B1 and B2)
offer.available_between?("08-04-2016", "10-04-2016")
=> false (because of B1 and B3)
offer.available_between?("06-04-2016", "07-04-2016")
=> true (because there is only B1 during this period)
は、tryです:
class Offer < ActiveRecord::Base
# True if and only if each day between date_begin and date_end has at least one place left.
def available_between?(date_begin, date_end)
(date_begin.to_datetime.to_i .. date_end.to_datetime.to_i).step(1.day) do |date|
day = Time.at(date)
nb_places_taken_this_day = self.bookings.where("date_begin <= :date AND date_end >= :date", date: day).count
return false if nb_places_taken_this_day >= self.places
end
true
end
end
offer.available_between?(booking.date_begin, booking.date_end)
複数の分離SQLクエリがあるので、私は特に、すべてこれで快適に感じることはありません。
ActiveRecordをより効率的に使用してこれを実現するより良い方法がありますか?
? trueを返し、falseを返します。 例からわかるように、date_begin..date_end期間中に毎日適切な数の予約が行われた場合はtrueを返します。私は正しい? – SunnyMagadan
私はそうは思わない。私は例を使って質問を更新し、もう少し明確にするためにメソッドを変更しました。ありがとう。 – rdupz
ありがとうございますが、サンプル実装はまだ混乱しており、常にtrueを返します。サイクル内にreturn文がありませんでした(nb_places_taken_this_day> = self.placesの場合はfalseを返します)。 今度は、この期間の毎日の予約数が場所の数より少ない場合、あなたのメソッドはtrueを返すはずです。 – SunnyMagadan