Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 处理Rails 4中再次发生的事件_Ruby On Rails_Ruby_Ruby On Rails 4 - Fatal编程技术网

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或类似的内容。编辑了我的答案。