我正在研究为重复发生的事件实现逻辑的方法。我想展示即将到来的一周的活动,取决于他们的复发。
例如,我有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)的列并且有一个Rake任务,它将使用next_date再次更新它?那会有用吗?我不确定那里的逻辑,记住。
答案 0 :(得分: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作业或其他类型的定期作业,这些作业将在每周开始时计算下一个事件的日期并将其保存到数据库中。
您可以将频率存储为天数或周数,而不是字符串。
保持变量&#39;显示&#39;如果您想要显示接下来7天的事件并且想要在事件结束时停止显示事件,那将会很麻烦。日期更灵活:
@events = Event.where('next_event > ? AND next_event < ?', Time.now, Time.now+7.days)
答案 1 :(得分:2)
您可以将频率存储在事件表中,(每周1次,每两周2次),然后使用一些数学计算出即将到来的一周是否是原始日期后的偶数周,例如这样:
Event.where("(extract(week from NOW())::int - extract(week from time_from)::int) % 2 = 1 OR frequency = 1")
这应该抓住下周“2周周期”中的所有事件,或者将其频率设置为1。
注意:这至少适用于postgres,但您需要将数据类型更改为日期时间而不仅仅是时间。
如果您已经为事件存储了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)
注意强>: 我将“即将到来的一周”视为“下周”,如果您希望采取不同的行为,则需要对其进行修改。