我有一个用户表,购买表和赠品表,这将用户添加到,如果他们注册了一个高级的服务。保费表有用户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的尝试消毒/报价绑定的值,但真正你在另一个表引用现有列。使用?
占位符语法是文字,而不是现有列引用。
当你联已命名的列(因此不绑定值),您插入?
的查询占位符,会发生什么。
因此,而不是:
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
条款这样做。