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

问题描述 投票:0回答:1

我有一个用户表,购买表和赠品表,这将用户添加到,如果他们注册了一个高级的服务。保费表有用户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语句使我不能用典型的列名?

ruby-on-rails date activerecord ruby-on-rails-5.1
1个回答
2
投票

问题是,Postgres的尝试消毒/报价绑定的值,但真正你在另一个表引用现有列。使用?占位符语法是文字,而不是现有列引用。

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

因此,而不是:

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条款这样做。

© www.soinside.com 2019 - 2024. All rights reserved.