RubyonRails-在具有多个条件的对象上查询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是输出日期,两者都声明了正确的日期格式。

我正确地传递了参数,问题是只有当我为今天选择了输入日期,为tommorow选择了输出日期时,我才能得到正确的搜索结果。如果我在这两天之间多放几天,即使数据库中有这些天的可用性,搜索也不会给我任何结果。

这不是执行此操作的方式吗?我不能把这个搜索放在控制器上,因为有很多INNER JOIN,而且它变得"丑陋",在我实现这个之前,其他过滤器的所有搜索都能正常工作。

提前感谢

是否可以直接在定义的范围中使用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>)
}

最新更新