Rails ActiveRecord, где не работает datetime - PullRequest
0 голосов
/ 15 октября 2018

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

Например, у меня есть модель m с графиком из: 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 .Если текущее время вс, 14 октября 2018 19:14:00 UTC +00: 00 , тогда я буду искать только из , тогда я получу m, но если текущее времяis Sun, 14.10 2018 20:01:00 UTC +00: 00 и я ищу только из Я бы ничего не получил.

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

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')

1 Ответ

0 голосов
/ 15 октября 2018

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

  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)
...