我很惊讶地看到本地工作的范围在heroku上没有正确响应。 heroku是否定义了一次范围而不是一次?有没有更好的方法来编写这些范围?
# Offset date for early morning hours
if Time.now.hour < 4
scope :upcoming, lambda { between(Date.tomorrow, Date.tomorrow+4.days) }
scope :tomorrow, lambda { on(Date.today) }
scope :today, lambda { on(Date.yesterday).not_over }
else
scope :upcoming, lambda { between(Date.tomorrow+1.day, Date.tomorrow+5.days) }
scope :tomorrow, lambda { on(Date.tomorrow) }
scope :today, lambda { on(Date.today).not_over }
end
检查时间是否在上午12点到凌晨4点之间。如果是,则从昨天开始定义:today
,:tomorrow
和:upcoming
。如果没有,它通常会定义范围。
当用户正在寻找即将到来的“今天”活动并且在周五晚上凌晨1点时,他/她将会看到一直持续到凌晨4点的事件。例如,一个尚未关闭的俱乐部。
Heroku通过else语句定义我的范围,无论它是什么时候。
答案 0 :(得分:1)
这在本地工作,因为每次刷新页面时,本地网络服务器会重新加载所有类。在生产(heroku env)中,出于性能原因,这显然不会发生。在应用启动时,只加载一次类。因此,无论何时何时,它将定义创建哪组范围。
我建议像这样重写你的范围(将时间检查移动到范围本身):
scope :upcoming, lambda {
diff = Time.now.hour < 4 ? 0 : 1
between(Date.tomorrow+diff.day, Date.tomorrow+(4 + diff).days)
}