ActiveRecord - 不能在 BETWEEN 语句中使用列名

ActiveRecord - Can't use column names in BETWEEN statement

我有一个用户 table、一个购买 table 和一个高级 table,如果用户注册了高级服务,就会将其添加到其中。 Premium table 具有用户 ID、添加日期和删除日期。我想查找用户在使用高级服务时进行的购买。我在想:

Purchase.joins(user: :premiums).where("purchases.date BETWEEN ? AND ?", "premiums.add_date", "premiums.remove_date")

当我尝试这个的变体时,我收到以下错误:

ActiveRecord::StatementInvalid: PG::InvalidDatetimeFormat: ERROR: invalid input syntax for type timestamp: "premiums.add_date"

如果我把它分成两个 .where 语句它工作正常:

Purchase.joins(user: :premiums).where("purchases.date >= premiums.add_date").where("purchases.date <= premiums.remove_date")

阻止我使用典型列名的 BETWEEN 语句是什么?

问题在于 Postgres 正试图 sanitize/quote 绑定值,但实际上您是在另一个 table 中引用现有列。使用 ? 占位符语法是针对文字,而不是对现有列的引用。

当您内联插入到 ? 的查询占位符中的命名列(因此不绑定值)时会发生什么。

所以代替:

Purchase.joins(user: :premiums)
.where("purchases.date BETWEEN ? AND ?", "premiums.add_date", "premiums.remove_date")

尝试

Purchase.joins(user: :premiums)
 .where("purchases.date BETWEEN premiums.add_date AND premiums.remove_date")

您已经在使用两个 where 子句的版本中执行此操作。