我有一个适用于约会的项目。这意味着管理员应该设置一个定期的时间表,意思是“每个星期一和星期二从8到12”,用户应该能够根据这个选择日期。
到目前为止,我使用字符串来保存管理员的数据时间表:“星期一,8到12”,“星期二,8到12”以及用户约会的日期时间。事情是,查询变得非常复杂,我开始讨论可能有更好的方法来处理这类问题。具体来说,将管理员日程安排设置为字符串是没用的,但我不确定要使用什么。
我很欣赏这个主题的任何暗示。提前谢谢。
答案 0 :(得分:0)
从 Postgres 的角度来看,我建议您查看timestamp ranges,由数据类型tsrange
指示(或tstzrange
如果您需要时区)。< / p>
例如,给出如下数据:
create table availability
(
id serial,
time_chunk tsrange,
label text
);
insert into availability (time_chunk, label)
VALUES ('[2014-12-01 08:00, 2014-12-01 12:00)', 'chunk 1'),
('[2014-12-01 14:00, 2014-12-01 16:30)', 'chunk 2');
您可以在针对该表和其他人的查询中使用range operators。
例如,要检查给定tsrange
是否适合可用块,您可以使用包含运算符@>
:
select *
from availability
where time_chunk @> '[2014-12-01 09:00, 2014-12-01 10:00)';
select *
from availability
where time_chunk @> '[2014-12-01 11:00, 2014-12-01 12:00)';
select *
from availability
where time_chunk @> '[2014-12-01 11:00, 2014-12-01 12:00]';
select *
from availability
where time_chunk @> '[2014-12-01 16:00, 2014-12-01 17:00)';
前两个查询返回id
为1的行,而后两个返回空集。对于第三个查询,这是因为当可用时间段为独占时,查询的结束时间为12:00
包含(意味着它实际上仅在11:59
<之前可用strong>包含或12:00
独占。
第四个查询超过了第二个可用插槽,因此也返回一个空集。
您可能需要一个比这更复杂的数据模型 - 可能是另一个表appointments
,它跟踪实际约会,并且可以与availability
一起加入,但是这应该提供一些坚实的构建块,允许您用字符串以外的方式表示事物并提高可查询性。
这是带有上述SQL的sqlfiddle。
在 Rails 中,你应该能够为这些表创建数据模型,然后使用诸如 containment 运算符之类的东西作为where
函数的参数,像:
Availability.where("time_chunk @> ?", params[:time_chunk])
允许您传入变量time_chunk
值。