定期约会数据定义

时间:2014-11-28 15:48:45

标签: ruby-on-rails postgresql datetime schedule

我有一个适用于约会的项目。这意味着管理员应该设置一个定期的时间表,意思是“每个星期一和星期二从8到12”,用户应该能够根据这个选择日期。

到目前为止,我使用字符串来保存管理员的数据时间表:“星期一,8到12”,“星期二,8到12”以及用户约会的日期时间。事情是,查询变得非常复杂,我开始讨论可能有更好的方法来处理这类问题。具体来说,将管理员日程安排设置为字符串是没用的,但我不确定要使用什么。

我很欣赏这个主题的任何暗示。提前谢谢。

1 个答案:

答案 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值。