0

レール3.2.3とルビー1.9.3を使用したRoR初心者

現在、2つのdate_timesでユーザーが選択した日付に一致するホテルの空室状況を表示しようとしています。

    scope :by_availabilities, lambda { |first_day, last_day|
      joins(:rooms).
      joins('INNER JOIN availabilities ON rooms.id=availabilities.room_id').
      where(get_my_where(first_day, last_day)).
      group('hotels.id'<other fields>
    }

def self.get_my_where(first_day, last_day)
        difference = (last_day-first_day).to_i

        condition = ""


        if (difference==1)
          condition = "availabilities.day = '#{first_day}'"
          condition+=""
        else

            for i in 1..difference do
              if(i==difference)
                  condition +="(availabilities.day = '#{first_day}' AND availabilities.availability > 0)"
              else
                condition+="(availabilities.day = '#{first_day+i}' AND availabilities.availability > 0) AND "
              end

            end
        end
--other innerjoins--

first_dayは開始日、last_dayは終了日であり、どちらも正しく宣言されており、正しい日付形式になっています。

パラメータを正しく渡しています。問題は、たとえば今日のイン日付と明日のアウト日付を選択した場合にのみ、正しい検索結果が得られることです。その間にさらに日数を入れると、その日のDBに可用性があるにもかかわらず、検索結果がまったく表示されません。

これはこれを実行する方法ではありませんか?内部結合が多く、「醜い」状態になっていたため、この検索をコントローラーに配置できません。これを実装するまで、他のフィルターによるすべての検索は正しく機能していました。

前もって感謝します

4

1 に答える 1

0

代わりに、定義したスコープでbetween演算子を直接使用できますか?このようなもの:

scope :by_availabilities, lambda { |first_day, last_day|
  scope = joins(:rooms).
          joins('INNER JOIN availabilities ON rooms.id=availabilities.room_id')
  (first_day..last_day).each { |day|
    scope = scope.where("availabilities.day = ?", day)
  }
  scope = scope.group('hotels.id'<other fields>)
}
于 2012-07-13T18:48:56.457 に答える