Ruby on Rails - 在具有多个条件的对象上查询JOINS

时间:2012-07-13 17:31:44

标签: sql ruby-on-rails inner-join

RoR初学者在这里使用rails 3.2.3和ruby 1.9.3

目前,我正在尝试在两个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是输出日期,两者都是正确声明的,并且格式正确。

我正确地传递了params,问题是如果我选择今天的日期和tommorow的日期,我只能获得正确的搜索结果。如果我在两者之间放置更多天,那么搜索根本没有给我任何结果,即使这些天数据库中有可用性。

这不是执行此操作的方法吗?我不能把这个搜索放在控制器上,因为有许多INNER JOINS并且它变得“丑陋”,其他过滤器的所有搜索都正常工作,直到我实现了这个。

提前致谢

1 个答案:

答案 0 :(得分: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>)
}