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
子句的版本中执行此操作。
我有一个用户 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
子句的版本中执行此操作。