Rails ActiveRecord, где дата и время не работает

У меня есть модель с расписанием has_one (от: datetime, from_a: datetime, to: datetime). Я хочу получить все модели, у которых есть расписание, соответствующее дате и времени выполнения запроса.

Например, у меня есть модель m с расписанием from: Sun, 15 октября 2018 г., 19:00:00 UTC +00:00, from_a: Вс, 14 октября 2018 г., 19:20:00 UTC +00:00 и до: Вс, 14 октября 2018 г., 20:00:00 UTC +00:00. Если текущее время Sun, 14 Oct 2018 19:14:00 UTC +00:00, то и я ищу только from, тогда я получу m, но если Текущее время: Sun, 14 Oct 2018 20:01:00 UTC +00:00 и я ищу только from и ничего не получаю.

Вот код, который я пробовал:

scope :s, ->(time, type) { unscoped.joins(:schedule).where("\"schedule.#{type.to_s}\" < ? AND \"schedule.to\" > ?", time, time) }

и когда я вызываю область действия, будет Model.s(DateTime.now, :from). Дело в том, что этот код не работает так, как предполагалось, поскольку он не дает ни правильного результата, ни результата, который я ожидаю.

ОБНОВЛЕНИЕ
Это сгенерированный запрос для Model.s(DateTime.now, :from)

SELECT "models".* FROM "models" INNER JOIN "schedules" ON "schedules"."model_id" = "models"."id" WHERE ("schedules.from" < '2018-10-15 19:59:33.737073' AND "schedules.to" > '2018-10-15 19:59:33.737073')

person Anonymus    schedule 15.10.2018    source источник
comment
Любая помощь будет оценена по достоинству, если я что-то пропустил, сообщите мне. Я знаю, что это немного запутанно, но мне трудно объяснить себя... так что прошу прощения за любые ошибки, которые я сделал...   -  person Anonymus    schedule 15.10.2018
comment
Пожалуйста, добавьте сгенерированный запрос (из вашей консоли) к вашему вопросу (используя ссылку редактирования под тегами). Кроме того, ваш комментарий не добавляет к вопросу. Может, удалить?   -  person jvillian    schedule 15.10.2018
comment
это множественное число, я удалил s по каким-то странным причинам, что касается одинарных кавычек, это дает мне ошибку, если я не помещаю их @muistooshort   -  person Anonymus    schedule 15.10.2018


Ответы (1)


У вас есть несколько проблем, первая из которых скрывает остальные:

  1. Одинарные кавычки используются для строковых литералов в SQL, поэтому 'schedule.from' и 'schedule.to' — это просто строки в SQL, а не ссылки на столбцы в таблице schedule.
  2. schedule должно быть schedules, так как Rails любит использовать множественное число для имен таблиц.
  3. to и from являются ключевыми словами в SQL и PostgreSQL ( который вы, кажется, используете), поэтому они должны быть (двойными) в кавычках, когда вы используете их в качестве имен столбцов.

Первое исправлено путем удаления случайных одинарных кавычек. Второй с использованием имени таблицы во множественном числе. Третий путем двойного цитирования идентификаторов нарушения. Результат будет примерно таким:

unscoped.joins(:schedule).where(%Q(schedules."#{type.to_s}" < ? and schedules."to" > ?), time, time)

или возможно:

unscoped.joins(:schedule).where(%Q(schedules."#{type.to_s}" < :time and schedules."to" > :time), time: time)
person mu is too short    schedule 15.10.2018
comment
Спасибо за ответ, но я сделал все, что вы написали, и все равно возвращает пустой массив... - person Anonymus; 16.10.2018
comment
@Anonymus Хотел бы я забыть о часовых поясах, они злые :) - person mu is too short; 16.10.2018