2014-02-04 2 views
1

Я был удивлен, увидев, что область действия, которая работает локально, не отвечает правильно на героку. Геемку определяет область раз и навсегда? Есть ли лучший способ написать эти области?Объем модели работает локально, но не на 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:00 и 4:00. Если да, то он определяет :today, :tomorrow и :upcoming, начиная со вчерашнего дня. Если нет, он определяет области действия.

Это так, когда пользователь ищет предстоящее событие, которое «сегодня», а утром в пятницу в пятницу вечером он/она увидит события, которые продолжаются до 4 утра. Например, клуб, который еще не закрыт.

Heroku определяет мои области применения инструкцией else независимо от времени.

ответ

1

Это работает для вас локально, потому что ваш локальный веб-сервер перезагружает все классы каждый раз, когда вы обновляете страницу. В производстве (heroku env) это явно не произойдет по соображениям производительности. Классы загружаются только один раз, при запуске приложения. Итак, какое бы время ни было в этот момент, он определит, какой набор областей создан.

Я предлагаю переписывая областей, как это (переместить проверку времени в себя прицелы):

scope :upcoming, lambda { 
    diff = Time.now.hour < 4 ? 0 : 1 
    between(Date.tomorrow+diff.day, Date.tomorrow+(4 + diff).days) 
} 
Смежные вопросы