Ruby on rails 日历中的重复事件-Rails
我正在寻找模拟重复事件的最佳方法。我正在使用fullcalendar显示事件。但我想重复发生的事件最好在rails后端处理 我已经研究了其他问题和现有的示例代码,但没有找到任何适合的 它的行为应该类似于谷歌日历。因此,应该可以删除/修改定期事件系列的单个事件。但是在数据库中保存事件系列的所有事件似乎效率低下。此外,还可以创建单个事件而不重复发生 什么是好的模型架构 我的事件模型现在看起来是这样的(没有附加属性):Ruby on rails 日历中的重复事件-Rails,ruby-on-rails,ruby-on-rails-3,calendar,fullcalendar,recurring-events,Ruby On Rails,Ruby On Rails 3,Calendar,Fullcalendar,Recurring Events,我正在寻找模拟重复事件的最佳方法。我正在使用fullcalendar显示事件。但我想重复发生的事件最好在rails后端处理 我已经研究了其他问题和现有的示例代码,但没有找到任何适合的 它的行为应该类似于谷歌日历。因此,应该可以删除/修改定期事件系列的单个事件。但是在数据库中保存事件系列的所有事件似乎效率低下。此外,还可以创建单个事件而不重复发生 什么是好的模型架构 我的事件模型现在看起来是这样的(没有附加属性): #表名:事件 # #id:整数不为空,主键 #员工id:整数 #创建时间:date
#表名:事件
#
#id:整数不为空,主键
#员工id:整数
#创建时间:datetime
#更新时间:datetime
#开始时间:datetime
#结束时间:datetime
#
类事件
只是我头脑中的一个想法,也许comenters会指出一个我目前没有想到的问题:
我会制作一个RecurringEvent
模型(或者你想叫它什么),这个模型有很多:事件
假设每个事件都是由一名员工创建的(基于您的笔记),那么RecurringEvent
也将归属于:employee
。然后,您可以建立一个has_many:through
关系,其中员工有许多事件,并且有许多重复事件
RecurringEvent模型可以有一个开始日期和一个模式,它最初可以使用这个模式来创建单独发生的事件。然后,对于定期系列中的任何事件,您可以修改或删除该个别事件,但也可以“重新生成系列”,删除系列中的所有事件(或系列中的所有未来事件),并基于新模式重新生成这些事件,例如,将会议从“每周二”移动到“每周四”
另一个好处是,你可以创建一个重复事件一览表,这可能会让你更好地了解人们的主要义务
就像我说的,从我的头脑中,这就是我将如何处理它,但这只是一个想法,我还没有建立任何类似的东西,所以我不知道我建议的方法中是否有任何大的缺陷
祝你好运,请把你最后要做的事情贴出来 以下是我将如何对此进行建模。我没有太多使用谷歌日历,所以我的功能基于谷歌的重复事件
所有模型都应具有通常的id、在创建时的id、在更新时的id属性。列出了自定义属性。如果该属性是另一个模型,您将通过一个关联来实现它,例如有一个
或属于
重现期
Event
base\u Event\code>有一个:base\u Event,:class\u name'Event'
Time
end#u date#如果永远重复,则可能为零WeeklyRecurrence
recurrencehas_one:recurrence,:as=>:recurrenceArray[OccurrenceOverride]
overrides\code>有很多:overrides,:class\u name=>“OccurrenceOverride”重现期从其基本事件开始的日期开始。另外,我假设一个事件
的雇员id是指创建该事件的雇员。重现期也将属于创建基本事件的员工
模型取决于您希望如何灵活地指定重复发生。你会支持“周二和周四每两周从上午10点到上午11点,下午2点到下午3点”还是“每周重复”?这里的模型只支持“每周重复”、“每两周重复”等。;如果需要,可以扩展它
WeeklyRecurrence
Integer
复发间隔周
RecurrencePeriod
recurrence\u period
属于:recurrence,:多态=>true
我在这里使用,因为我认为如果您想要不止一种类型的复发,例如周复发
和日复发
,它们可能会很有用。但我不确定它们是否是正确的建模方法,因此如果它们不是,只需使用has\u one:weekly\u recurrence
和besides\u to:recurrence\u period
该库似乎对计算复发率很有用。如果上面的WeeklyRecurrence
功能不够强大,您可能只想在模型中存储一个冰块Schedule
对象,替换WeeklyRecurrence
。要在模型中存储Schedule
对象,请将其另存为属性“Schedule”,将serialize:Schedule
放入模型定义中,并在数据库中生成文本列“Schedule”
OccurrenceOverride
处理正在编辑的重复事件的单个实例的情况
OccurrenceOverride
RecurrencePeriod\u to\u override属于:RecurrencePeriod\u to\u override,:class\u name=>“RecurrencePeriod”RecurrencePeriod
original_start_Time#唯一标识该重现期内要替换的重现期Time
replacement\u Event\code>有一个:replacement\u Event,:class\u name=>“Event”;如果该重复周期已被删除而不是编辑,则可能为零Event
RecurrencePeriod
中,创建一个方法generate\u events\u(开始日期、结束日期)
,该方法生成事件
s,否
# Table name: events
#
# id :integer not null, primary key
# employee_id :integer
# created_at :datetime
# updated_at :datetime
# starts_at :datetime
# ends_at :datetime
#
class Event < ActiveRecord::Base
attr_accessible :starts_at, :ends_at
end
# Holds most of my event's data; name, description, price ...
class Event < ActiveRecord::Base
has_many :schedules
has_many :occurrences
attr_accessible :started_at, :expired_at # expired_at is optional
end
# Holds my schedule object
class Schedule < ActiveRecord::Base
belongs_to :event
attr_accessible :ice_cube_rule # which returns my deserialized ice_cube object
end
# Holds generated or manually created event occurrences
class Occurrence < ActiveRecord::Base
belongs_to :event
attr_accessible :started_at, :expired_at
attr_accessible :generated # helps me tell which occurrences are out of an ice_cube generated serie
attr_accessible :canceled_at
end
before_save :create_weekly_schedule, if: :recurring
after_save :create_occurences_if_recurring
def create_occurences_if_recurring
schedules.each do |sched|
occurences.create(start_date: sched.start_time, end_date: sched.end_time)
end
end