我已经为用户预订了他们的教师。我目前面临的问题是,如何阻止用户过去预订?我使用过DateTime。
另一个问题是如果用户设置了启动DateTime,我该如何防止结束DateTime小于启动DateTime?
我没有尝试过,我可以提出建议。目前的代码显示了如何停止双重预订。
_form.hmtl.erb
<%= form_for(@lesson) do |f| %>
<div class="field">
<%= f.label :user_id %><br>
<%= f.number_field :user_id %>
</div>
<div class="field">
<%= f.label :lesson_start_date_time %><br>
<%= f.datetime_select :lesson_start_date_time %>
</div>
<div class="field">
<%= f.label :lesson_end_date_time %><br>
<%= f.datetime_select :lesson_end_date_time %>
</div>
<div class="actions">
<%= f.submit %>
</div>
<% end %>
Lesson.rb
class Lesson < ActiveRecord::Base
belongs_to :user
validate :lessons_must_not_overlap
private
def lessons_must_not_overlap
return if self
.class
.where.not(id: id)
.where(user_id: user_id)
.where('lesson_start_date_time < ? AND lesson_end_date_time > ?', lesson_end_date_time, lesson_start_date_time)
.none?
errors.add(:base, 'Overlapping lesson exists')
end
end
答案 0 :(得分:2)
只需添加一个验证来检查
start date
已过去end_date
小于start_date
试一试
validate :datetime_eligibility
private
#...
def datetime_eligibility
# Check if `start_date` is less than `current time`
if lesson_start_date_time < Time.current
errors.add(:base, "can't be in past")
# Check if `end_date` is less than `start_date`
elsif lesson_end_date_time < lesson_start_date_time
errors.add(:base, 'start date should be less than end date')
end
end
注意:请始终将日期时间与Time.current
而不是Time.now
进行比较,以避免TimeZone与应用程序发生问题
答案 1 :(得分:2)
您永远不应该信任用户输入(因此html中的任何更改都无关紧要)
您只需要验证来自用户的日期(保持验证尽可能简单,一个验证应该有一个责任)
validates :lesson_end_date_time, :lesson_start_date_time, presence: true
validate :start_date_in_future, :dates_has_positive_length
private
def start_date_in_future
return if lesson_start_date_time.blank?
return if lesson_start_date_time >= Date.current
errors.add(:lesson_start_date_time, :invalid)
end
def dates_has_positive_length
return if lesson_end_date_time.blank? || lesson_start_date_time.blank?
return if lesson_end_date_time >= lesson_start_date_time
errors.add(:lesson_end_date_time, :invalid)
end