Ruby on rails 处理Rails 4中再次发生的事件
我在寻找方法来实现重复事件的逻辑。我想展示下一周的活动,取决于它们的重现 例如,我有两个活动,一个是每周一次,另一个是每周两次,在我看来,本周我只会展示一个活动,但下周将有两个展示 到目前为止,我已经在准备创建的迁移文件中设置了这样的模型Ruby on rails 处理Rails 4中再次发生的事件,ruby-on-rails,ruby,ruby-on-rails-4,Ruby On Rails,Ruby,Ruby On Rails 4,我在寻找方法来实现重复事件的逻辑。我想展示下一周的活动,取决于它们的重现 例如,我有两个活动,一个是每周一次,另一个是每周两次,在我看来,本周我只会展示一个活动,但下周将有两个展示 到目前为止,我已经在准备创建的迁移文件中设置了这样的模型 class CreateEvent create_table :events do |t| t.string :title t.text :description t.time :time_from t.time :time_to
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
我试图让这个过程尽可能简单,所以我需要实现某种逻辑,从下一天的事件开始计算,然后计算到今天的周数。这里不太清楚
我甚至可以在事件模型中设置一个标志,一个名为displayboolean的列,并设置一个Rake任务,使用下一个_日期再次更新它吗?这样行吗?我不确定其中的逻辑,注意。我建议您将事件的原始日期存储在数据库中,然后计算模型中的下一个事件
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作业或其他类型的定期作业,在每周开始时计算下一个事件的日期并将其保存到数据库中
您可以将频率存储为天数或周数,而不是字符串
如果要在接下来的7天内显示事件,并且要在事件结束后停止显示事件,则保留变量“display”会很麻烦。日期更灵活:
@events = Event.where('next_event > ? AND next_event < ?', Time.now, Time.now+7.days)
我建议您将事件的原始日期存储在数据库中,并计算模型中的下一个事件
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作业或其他类型的定期作业,在每周开始时计算下一个事件的日期并将其保存到数据库中
您可以将频率存储为天数或周数,而不是字符串
如果要在接下来的7天内显示事件,并且要在事件结束后停止显示事件,则保留变量“display”会很麻烦。日期更灵活:
@events = Event.where('next_event > ? AND next_event < ?', Time.now, Time.now+7.days)
您可以将频率存储在事件表中,每周1次,每两周2次,然后使用一些数学计算,以确定下一周是否比原始日期晚偶数周,如下所示:
Event.where("(extract(week from NOW())::int - extract(week from time_from)::int) % 2 = 1 OR frequency = 1")
这将捕获下周2周周期内的所有事件,或者其频率设置为1
注意:这至少适用于postgres,但您需要将数据类型更改为datetime,而不仅仅是time
如果已经为事件存储了下一个_日期,则可以使用时间范围选择下一周的所有事件:
start_date = Date.today.beginning_of_week + 7.days
end_date = start_date + 6.
@events = Event.where(next_date: start_date..end_date)
注:
我阅读“下周”和“下周”一样,如果您希望有不同的行为,您必须对其进行一些修改。您可以将频率存储在事件表中,每周1次,每两周2次,然后使用一些数学计算来确定“下周”是否在原始日期后的偶数周,如下所示:
Event.where("(extract(week from NOW())::int - extract(week from time_from)::int) % 2 = 1 OR frequency = 1")
这将捕获下周2周周期内的所有事件,或者其频率设置为1
注意:这至少适用于postgres,但您需要将数据类型更改为datetime,而不仅仅是time
如果已经为事件存储了下一个_日期,则可以使用时间范围选择下一周的所有事件:
start_date = Date.today.beginning_of_week + 7.days
end_date = start_date + 6.
@events = Event.where(next_date: start_date..end_date)
注:
我将下周和下周一样阅读,如果您希望有不同的行为,您必须对其进行一点修改。谢谢您的回答,我将尝试一下,看看结果如何:-好的,所以现在我收到一个错误PG::InvalidParameterValue:错误:时间单位周未识别。。这是因为时间从,我用它来存储时间15:00,我用时间到18:00,存储在字段中的值看起来是这样的2000年1月1日18:18,对于保存的每个记录,1月1日总是存在??啊,是的,有意义。您需要包含实际日期的数据类型才能从中提取周。将其更改为时间戳应该可以解决问题。或者,如果您不想将time\u从/time\u更改为,您可以添加一个t.datetime:first\u occurrence\u at或类似的内容。编辑了我的答案。谢谢你的回答,我会尝试一下,看看结果如何:-好的,现在我得到一个错误PG::InvalidParameterValue:错误:时间单位周未识别。。这是因为时间从,我用它来存储时间15:00,我用时间到18:00,存储在字段中的值看起来是这样的2000年1月1日18:18,对于保存的每个记录,1月1日总是存在??啊,是的,有意义。您需要包含实际日期的数据类型才能从中提取周。将其更改为时间戳应该可以解决问题。或者如果你不想改变时间 o您可以添加一个t.datetime:first\u occurrence\u at或类似的内容。编辑了我的答案。