如何使用postgresqlvalidationRails中的重叠时间
我有一个Event model
,在我的日程安排应用程序中有end_at
时间和end_at
时间,我想在保存之前validation重叠时间。
我在Cloud9上创建了rails应用程序。
我的观点图如下;
Day1 07:00 - 07:20 event1 10:30 - 11:30 event2 15:40 - 16:10 event3 [add event button] Day2 08:15 - 09:05 event4 12:08 - 13:04 event5 14:00 - 14:25 event6 [add event button] [save schedule button]
end_at
time和end_at
时间可以同时更改和添加。
我想做的是显示错误,如果我尝试为Day1
添加(或更改) 07:05 - 07:30
,例如, 13:50 - 14:30
,依此类推。
例如;
app_development =#select * from events;
id | start_at | end_at | title | detail | schedule_id | created_at | updated_at ----+----------+----------+--------+--------+-----------------+----------------------------+---------------------------- 1 | 07:00:00 | 07:20:00 | event1 | | 1 | 2016-04-12 05:28:44.166827 | 2016-04-12 12:52:07.682872 2 | 10:30:00 | 11:30:00 | event2 | | 1 | 2016-04-12 05:28:44.17747 | 2016-04-12 12:52:07.689934 3 | 15:40:00 | 16:10:00 | event3 | | 1 | 2016-04-12 05:29:07.5005 | 2016-04-12 12:52:07.693477
我在表格上方添加了07:05 - 07:30
,但validation不起作用。
虽然我问了类似的问题 ,但我被建议使用postgresql而不是sqlite3。
所以我设法配置postgresql,但结果是一样的。 如果你能告诉我如何检查和显示错误,将不胜感激。
schema.rb
create_table "events", force: :cascade do |t| t.time "start_at" t.time "end_at" t.string "title" t.integer "room_id" ... create_table "rooms", force: :cascade do |t| t.string "room" t.integer "schedule_id" ... create_table "schedules", force: :cascade do |t| t.string "title" t.integer "user_id" t.date "departure_date" ...
提供以下型号 :
class Event range { where('(start_at BETWEEN ? AND ?)', range.first, range.last) } scope :exclude_self, -> id { where.not(id: id) } def overlap_error errors.add(:overlap_error, 'There is already an event scheduled in this hour!') end class Schedule < ActiveRecord::Base belongs_to :user has_many :rooms, inverse_of: :schedule accepts_nested_attributes_for :rooms, allow_destroy: true ... class Room < ActiveRecord::Base belongs_to :schedule, inverse_of: :rooms has_many :events, inverse_of: :room accepts_nested_attributes_for :events, allow_destroy: true ...
_schedule_form.html.erb
(f.object.departure_date if f.object.departure_date), class: 'form-control' %> $(function () { $('#datetimepicker').datetimepicker({format:'YYYY-MM-DD'}); });
<div id="room_"> Day
-