2015-05-09 2 views
1

Рассматривал способы реализации логики повторных событий. Я хотел бы показывать события на предстоящую неделю, в зависимости от их повторения.Обработка события повторения - Rails 4

Например, у меня есть 2 события, один раз еженедельно, а второй - два раза в неделю. На мой взгляд, на этой неделе я бы показал только одно событие, но на следующей неделе будет два показа.

До сих пор у меня есть мои модели созданы как и в миграционном файле, готовом быть создан

class CreateEvent 
    create_table :events do |t| 
    t.string :title 
    t.text :description 
    t.time :time_from 
    t.time :time_to 
    t.date :next_date 
    t.string :day 
    t.timestamps null: false 
end 
end 
# An Event `has_one` Frequency 

class CreateFrequency 
    create_table :frequencies do |f| 
    f.string :occurs 
    f.integer :event_id 
    t.timestamps null: false 
    end 
end 
# Was Thinking of pre populating this with Weekly and 2 weekly 
# A frequency `belongs_to` Event 

Я пытаюсь держать это как можно более простым, так что мне нужно реализовать какое-то логика где я буду делать расчет, начиная с событий next_date и считая недели, прошедшие до сегодняшнего дня. Не совсем здесь.

Мог ли я даже пойти по пути наличия флага в модели событий, столбца с именем display (boolean) и иметь задачу рейка, которая будет обновлять ее снова, используя next_date? Будет ли это работать? неуверенно логики есть ум

Любых советов или решений оценило

Спасибо

ответ

2

Вы можете сохранить частоту в таблице событий (1 за каждую неделю, 2 на каждые две недели), а затем использовать некоторые математику, чтобы выяснить, если предстоящая неделя четная сумма недель после первоначальной даты, что-то вроде этого:

Event.where("(extract(week from NOW())::int - extract(week from time_from)::int) % 2 = 1 OR frequency = 1") 

Это должно захватить все события, которые либо в «2-недельного цикла» на следующей неделе, или имеет свой набор частот на 1.

Примечание : Это будет работать для postgres at но вам нужно будет изменить тип данных на datetime, а не просто на время.

Если вы уже next_date сохранены для событий, то вы можете использовать диапазон времени, чтобы выбрать все события в предстоящей неделе:

start_date = Date.today.beginning_of_week + 7.days 
end_date = start_date + 6. 
@events = Event.where(next_date: start_date..end_date) 

Примечания: Я прочитал «предстоящей неделю», как " на следующей неделе ", вам придется немного изменить его, если вы хотите по-другому.

+0

Спасибо за ваш ответ, я попробую его и посмотрю, как это получится :-) – Richlewis

+0

ОК, так что на данный момент я получаю сообщение об ошибке 'PG :: InvalidParameterValue: ERROR:" time "units" week "not detected' .. было бы это из-за 'time_from', я использую это для хранения времени (15:00), и я использую time_to (18:00), значение, хранящееся в поле, похоже на« Январь 01, 2000 18 : 18', jan 01 всегда присутствует для каждой сохраненной записи? – Richlewis

+0

А, да, имеет смысл. Вам понадобится тип данных, содержащий фактическую дату, чтобы иметь возможность извлечь из нее неделю. Изменение этой проблемы в timestamp должно решить проблему. Или если вы не хотите изменить time_from/time_to, вы можете добавить t.datetime: first_occurrence_at или что-то в этом роде. Отредактировал мой ответ. –

2

Я рекомендую вам сохранить первоначальную дату события в базе данных, и вычислить следующее событие внутри вашей модели.

def frequency 
    case occurs 
    when 'weekly' 
    1.week 
    when 'biweekly' 
    2.week 
    end 
end 

def next_event 
    event_no = ((Time.now-first_event)/frequency).floor+1 
    return first_event + event_no*frequency 
end 

def event_next_week? 
    next_event < Time.now+1.week 
end 

Чтобы избежать необходимости делать вычисления каждый пользователь времени запрашивает список событий, которые вы можете иметь работу CRON или какой-либо другой вид повторяющихся работы, которая будет вычислять даты следующих событий в начале каждой недели и сохранить их в базу данных.

Вместо того, чтобы быть в виде строки, вы можете сохранить частоту в виде числа дней или недель.

Сохранение переменной «display» было бы проблематичным, если вы хотите отображать события в течение следующих 7 дней, и вы хотите прекратить отображение события после его завершения. Дата является более гибким:

@events = Event.where('next_event > ? AND next_event < ?', Time.now, Time.now+7.days) 
Смежные вопросы