Rails where 子句中的 6 个 ActiveRecord 求和列

Rails 6 ActiveRecord sum columns in where clause

我有一个 Rails 6 应用程序和一个带有 scheduled_atduration(分钟)列的表格。

我想获取 scheduled_at + duration.minutes > Time.current.

的所有记录

理想情况下我会有一个 ends_at 列,但不幸的是我没有。

有没有办法做到这一点?

您可以使用 Postgres 中的 INTERVAL 方法并将其与 NOW

的当前时间进行比较
Model.where("scheduled_at + INTERVAL '? minutes' > NOW()", 10)

# or ...
Model.where("scheduled_at + INTERVAL '? minutes' > ?", 10, Time.current)

您可以使用 postgresql 的 interval 然后加上 1 分钟乘以您的持续时间

Record.where("(scheduled_at + INTERVAL '1' MINUTE * duration) > ?", Time.current)

确保你的持续时间是一个整数

您可以使用函数 make_interval 从列值(或任何整数)创建区间:

Model.where(
   "scheduled_at + make_interval(mins := models.duration::INTEGER) > current_timestamp" 
)

# Or if you want to use your Rails servers notion of "now":
Model.where(
   "scheduled_at + make_interval(mins := models.duration::INTEGER) > ?", Time.current 
)

:=named notation 的 Postgres 语法,类似于 Ruby.

中的关键字参数

如果你想在结果中有一个 ends_at 你可以 select 它:

Model
 .select(
   Model.arel_table[:*],
   "scheduled_at + make_interval(mins := models.duration::INTEGER) AS ends_at" 
 )
 .where(
   "ends_at > current_timestamp" 
 )