ActiveRecord - нельзя использовать имена столбцов в операторе BETWEEN - PullRequest
0 голосов
/ 07 февраля 2019

У меня есть таблица «Пользователи», таблица «Покупки» и таблица «Премиум», в которую добавляется пользователь, если он подписан на услугу «Премиум».Премиум таблица содержит идентификатор пользователя, дату, когда они были добавлены, и дату, когда они были удалены.Я хотел бы найти покупки, которые были сделаны, когда пользователь был частью услуги Premium.Я думал что-то вроде:

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, который мешает мне использовать типичные имена столбцов?

1 Ответ

0 голосов
/ 07 февраля 2019

Проблема в том, что 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...