gpt4 book ai didi

ruby-on-rails - 在 Postgres 中查询用户可用性

转载 作者:行者123 更新时间:2023-11-29 14:02:40 25 4
gpt4 key购买 nike

我正在构建一个网站,用户可以在该网站上发布空闲时间(例如周一和周二下午 2 点至 4 点),并在有空的情况下与其他用户预约聊天。

我的数据库是 Postgres(Rails 中的应用程序),所以我想让数据库来完成繁重的工作。

我想显示用户可用性的日历 View ,因此我尝试生成一个列表(时间、可用时间?)一周以轻松呈现 HTML。

让我们设置架构和数据:

$ createdb demo
$ psql demo
demo=# CREATE TABLE users (id SERIAL PRIMARY KEY, timezone VARCHAR);
demo=# CREATE TABLE timeslots (id SERIAL PRIMARY KEY, user_id INTEGER NOT NULL, days INTEGER[] NOT NULL, start_time TIME NOT NULL, end_time TIME NOT NULL);
demo=# CREATE TABLE chats (id SERIAL PRIMARY KEY, host_user_id INTEGER NOT NULL, guest_user_id INTEGER NOT NULL, start_time TIMESTAMP NOT NULL, end_time TIMESTAMP NOT NULL);
demo=# INSERT INTO users (timezone) VALUES ('America/Los_Angeles');
demo=# INSERT INTO users (timezone) VALUES ('America/New_York');
demo=# INSERT INTO timeslots (user_id, days, start_time, end_time) VALUES (1, '{3}', '10:00', '15:00');
demo=# INSERT INTO chats (host_user_id, guest_user_id, start_time, end_time) VALUES (1, 2, '2019-06-26 11:30:00', '2019-06-26 12:30:00');

现在我想为用户生成一个可用性列表,显示为包含 30 分钟 block 的日历。

我提出了以下查询:(对于用户 id=1)

WITH time_range AS (
SELECT generate_series(
'2019-06-26 00:00:00'::timestamp,
'2019-06-26 23:59:59'::timestamp,
'30 minutes'
) AS time
)
SELECT time, EXISTS (
SELECT 1
FROM timeslots
WHERE user_id = 1
AND extract(dow from time) = ANY(days)
AND start_time <= time::time
AND (time + '30 minutes'::interval)::time <= end_time
) AND NOT EXISTS (
SELECT 1
FROM chats
WHERE (
host_user_id = 1
OR guest_user_id = 1
) AND start_time <= time
AND (time + '30 minutes'::interval) <= end_time
) AS available
FROM time_range;

结果看起来有点像这样,但我无法获得正确的可用性:(

        time         | available 
---------------------+-----------
2019-06-26 00:00:00 | f
2019-06-26 00:30:00 | f
2019-06-26 01:00:00 | f
2019-06-26 01:30:00 | f
...
2019-06-26 23:30:00 | f
(48 rows)

对于改进此查询或一般方法的任何帮助,我们将不胜感激。查看彼此可用性的用户可能有不同的时区。预订聊天的开始和结束时间以 UTC 格式存储。在输出中包含时区也很棒。

感谢您的帮助!

最佳答案

好吧,已经有一段时间了,但我通过实际使用基于 JS 的日历而不是用纯 HTML 编写我自己的日历来解决这个问题。

我决定将 fullcalendar.io 与 TimeGrid View 一起使用 - https://fullcalendar.io/docs/timegrid-view

您可以指定一个从您的服务器获取事件并正确呈现它们的 URL:

const calendarEl = document.getElementById('calendar-schedule')
var calendar = new FullCalendar.Calendar(calendarEl, {
eventSources: [{
url: '/availabilities',
eventDataTransform: (event) => {
return {
id: event.id,
start: event.starts_at,
end: event.ends_at,
title: 'available'
}
}
}]
})

这样您的 API 只需要返回用户标记为可用的现有时隙。

关于ruby-on-rails - 在 Postgres 中查询用户可用性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56785011/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com