【问题标题】:regular appointments data definition定期约会数据定义
【发布时间】:2014-11-28 15:48:45
【问题描述】:

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

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

我会很感激任何关于这个主题的提示。提前致谢。

【问题讨论】:

  • 数据库模型可以随心所欲地复杂化,并且非常通用。但是在这里,您希望在复杂性和可用性之间找到一个折衷方案,因此这将取决于您需要执行的查询。有哪些用例?
  • 感谢@ClémentPrévost。我想要“管理员下周五 13 点有空”,或“从管理员日程中减去管理员约会”
  • 那里有一些可能适合您的日程安排宝石,例如fullcalendar-rails。它可以处理重复和一次性约会。 (免责声明:我自己从未使用过这个,不能凭经验说话)

标签: ruby-on-rails postgresql datetime schedule


【解决方案1】:

Postgres 的角度来看,我建议查看 timestamp ranges,由数据类型 tsrange(或 tstzrange,如果您需要时区)指示。

例如,给定数据如下:

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 inclusive,而可用时间段是exclusive(这意味着它实际上只在11:59inclusive 或 12:00 独家

第四个查询超过了第二个可用槽,因此也返回一个空集。

您可能需要一个比这更复杂的数据模型——也许是另一个表 appointments,它可以跟踪实际约会,并且可以与 availability 连接,对于初学者来说,但这应该提供一些可靠的构建块允许您用字符串以外的东西表示事物并提高可查询性。

这是带有上述 SQL 的sqlfiddle

Rails 中,您应该能够为这些表创建数据模型,然后使用诸如 containment 运算符作为where 函数的参数,喜欢:

Availability.where("time_chunk @> ?", params[:time_chunk])

这将允许您传入变量time_chunk 值。

【讨论】:

  • 感谢@khampson。这听起来是正确的方法。
猜你喜欢
  • 2013-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-31
  • 1970-01-01
  • 2018-09-26
  • 1970-01-01
相关资源
最近更新 更多