【发布时间】:2016-08-10 11:45:32
【问题描述】:
我尝试创建检查时间重叠的验证。
scope :overlapping_activity, ->(activity) { where("(start_on, end_on) OVERLAPS (?, ?)",
activity.start_on, activity.end_on }
validate :not_overlapping_activity
def not_overlapping_activity
if Activity.overlapping_activity(self).any?
errors.add(:base, "Zajęcie w tym okresie koliduje z innymi.")
end
end
错误:
ERROR: function pg_catalog.overlaps(time without time zone, time without time zone, unknown, unknown) is not unique
LINE 1: ...NT(*) FROM "activities" WHERE ((start_on, end_on) OVERLAPS (...
我找到了这个主题:Rails 3.1: Querying Postgres for records within a time range,但我无法在我的解决方案中使用它。当我尝试在范围内添加时间戳时,它显示了另一个语法错误。有人可以告诉我如何正确解决我的问题吗?
我如何尝试使用时间戳:
scope :overlapping_activity, ->(activity) { where("(start_on::timestamp, end_on::timestamp) OVERLAPS (?, ?)",
timestamp activity.start_on, timestamp activity.end_on) }
【问题讨论】:
-
你能试试`scope :overlapping_activity, ->(activity) { where("(start_on::timestamp, end_on::timestamp) OVERLAPS (timestamp :start_on, timestamp :end_on)", :start_on => activity.start_on, :end_on => activity.end_on) }` ?
-
@IVOGELOV 现在出错了:
ERROR: cannot cast type time without time zone to timestamp without time zone -
您确定
activity.start_on和activity.end_on包含日期而不仅仅是时间吗? -
@IVOGELOV 正如我在帖子标题中所写的那样,只有时间。在 PostgreSQL 数据库中,列是没有时区的时间
-
OVERLAPS要求所有 4 个参数的类型均为 TIMESTAMP - 日期加时间。如果您无法将时间转换为时间戳(添加任何日期,但所有 4 个参数的日期相同) - 那么您唯一的选择是将所有 4 次转换为秒(使用extract (epoch from t::interval)并使用此公式检查重叠 @ 987654330@
标签: ruby-on-rails ruby overlap