0

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

目前,我正在尝试显示与用户在两个 date_time 上选择的日期相匹配的酒店的可用性。

    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 是 in 日期, last_day 是 out 日期,两者都已正确声明且日期格式正确。

我正确地传递了参数,问题是如果我选择今天的日期和明天的过期日期,我只会得到正确的搜索结果。如果我在两者之间放置更多天,搜索根本不会给我任何结果,即使那些日子在数据库中有可用的数据。

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

提前致谢

4

1 回答 1

0

Can you instead just use the between operator directly in the scope that you've defined? Something like this:

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 回答