是否可以在完整日历中为每天设置事件限制
我可以设置显示事件的限制(已经这样做了),但我不知道如何为现有事件设置限制。
好吧,不知怎么的,我已经处理了太多事件的创建。
首先,你必须统计某一天发生的事件,并检查新事件是否会超过你的限制,所以在你的模型中:
def daily_events_limit(date)
date.each do |d|
if Event.where('start_date <= ? AND end_date >= ?', d, d).count > 4
break false
end
true
end
然后,在您的控制器中:
def create
@event = Event.new(event_params)
if (!@event.daily_events_limit(@event.start_date..@event.end_date) )
redirect_to @event, notice: 'You cannot get free day in selected period of time.'
else
...
end
end
在这种情况下,您无法创建新的事件,该事件将开始、结束或通过已经有5个事件的日期。
我不知道这是否是一种处理这个问题的优雅方法,但它很有效:)
通常,阻止创建/删除/更新类对象的逻辑应该发生在模型中。这样可以确保您的规则始终处于选中状态,而不仅仅是一个控制器中的一个实例。您可以使用验证来做到这一点:
型号:
class Event < ActiveRecord::Base
validate :validate_event_limit
private
def validate_event_limit
if Event.where(start_date: self.start_date.beginning_of_day..self.start_date.end_of_day).count > 4
errors[:base] << "You cannot get free day in selected period of time."
end
end
end
控制器内:
def create
@event = Event.new(event_params)
if @event.save
...
else
redirect_to @event, notice: @event.errors.full_messages
end
end
这将阻止在一天内创建第五个事件。因为您使用了验证,所以您可以使用相同的逻辑来检查可能将事件从一天移动到另一天的更新:
def update
if @event.update(event_params)
...
else
redirect_to @event, notice: @event.errors.full_messages
end
end