2014-10-15 2 views
2

Я пытаюсь уведомить своих клиентов о том, что срок их подписки истечет. Вот как я хочу, чтобы эти пользователи уведомили об этом. Они будет выставлен счет на дату они подписались + 1.year:Один год и один раз в неделю.

User.where(subscribed_at: 53.weeks.ago.beginning_of_day..53.weeks.ago.beginning_of_day) 

Мой вопрос будет ли это создать проблему с високосными годами? или есть лучший способ сделать это?

+0

Я думаю, что вы имели в виду использовать диапазон '53 .weeks.ago.beginning_of_day..53.weeks.ago.end_of_day'? Кроме того, почему бы не использовать '(1.year.ago-1.weeks) .beginning_of_day .. (1.year.ago-1.weeks) .end_of_day'? Это позволило бы Rails справиться с Годом (и 28/29 февраля, затем «добавить» неделю к нему) – MrYoshiji

+0

благодарит MrYoshiji. Можете ли вы добавить это к ответу? по какой-то причине я получаю разные даты для '1.year.ago-1.weeks' и' 53.weeks.ago' –

+0

Это потому, что год не строго равен 52 неделям (52 * 7 = 364 дня, один - здесь нет!). Я отправлю ответ в следующую минуту – MrYoshiji

ответ

2

Rails предоставляет Time#advance для "точных расчетов времени":

Time.now.advance(years: -1, weeks: -1) 
#=> 2013-10-08 17:54:36 +0200 

Time#all_day возвращает диапазон на весь день:

Time.now.advance(years: -1, weeks: -1).all_day 
#=> 2013-10-08 00:00:00 +0200..2013-10-08 23:59:59 +0200 
+0

Это идеальное сочетание! Спасибо за эти методы, я их не знал! – MrYoshiji

+0

killer dude, спасибо –

+0

@Stefan отличный ответ еще раз, можете ли вы порекомендовать любой умный способ тестирования этой области? –

1

Я думаю, вы должны использовать 1.year.ago, так как 52.weeks.ago не равен полному году (52 * 7 = 364 дня).

Использование 1.year.ago было бы лучше, потому что на самом деле изменяет year поле DateTime, больше ничего:

1.9.3p489 :005 > 2.year.ago 
# => Mon, 15 Oct 2012 11:51:44 EDT -04:00 
1.9.3p489 :006 > 5.year.ago 
# => Thu, 15 Oct 2009 11:51:47 EDT -04:00 
1.9.3p489 :007 > 999.year.ago 
# => Sun, 15 Oct 1015 11:51:50 LMT -04:56 # For some reason the TimeZone changed! 

В вашем случае, я хотел бы использовать следующую логику: NOPE NOPE, я бы использовал ответ @ Stefan!

range = (1.year.ago-1.week).beginning_of_day..(1.year.ago-1.week).end_of_day 
User.where(subscribed_at: range) 
Смежные вопросы