我在Rails應用程序中使用了validates_overlap gem(https://github.com/robinbortlik/validates_overlap)。下面是型號代碼:Rails + validates_overlap gem:何時向數據庫添加索引?
validates :start_time, :end_time, overlap: { scope: "device_id", exclude_edges: ["start_time", "end_time"] }
,這裏是它觸發SQL:
SELECT 1 AS one FROM "bookings" WHERE
((bookings.end_time IS NULL OR bookings.end_time > '2014-04-11 13:00:00.000000') AND
(bookings.start_time IS NULL OR bookings.start_time < '2014-04-11 16:00:00.000000') AND
bookings.device_id = 20) LIMIT 1
我只是想知道我是否應該加在我的Postgres數據庫,涵蓋START_TIME,END_TIME指數和device_id或類似的東西?例如像這樣:
add_index :bookings, [:device_id, :start_time, :end_time], unique: true
我想我同意你的回答(我絕對不是這方面的權威人士),但是出於好奇,我跑了一個測試,並且unique = true,我能夠在沒有數據庫錯誤的情況下保存相鄰的預訂。重疊錯誤完好無損,仍由ActiveRecord處理。 –
我有點不清楚。索引將檢查所有三列是否相等,並強制這些列的唯一性。因此,只有當您嘗試使用相同的開始時間和相同的結束時間爲相同的device_id添加預訂時,數據庫纔會拒絕此設置。 – Michael