Rails where 子句中的 6 个 ActiveRecord 求和列
Rails 6 ActiveRecord sum columns in where clause
我有一个 Rails 6 应用程序和一个带有 scheduled_at
和 duration
(分钟)列的表格。
我想获取 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"
)
我有一个 Rails 6 应用程序和一个带有 scheduled_at
和 duration
(分钟)列的表格。
我想获取 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"
)