У меня есть модель с расписанием has_one (from: datetime, from_a: datetime, to: datetime). Я хочу получить все модели, у которых есть расписание, соответствующее дате и времени выполнения запроса.
Например, у меня есть модель м с расписанием от: Вс, 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, но если текущее время Вс, 14 окт 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')
Пожалуйста, добавьте сгенерированный запрос (из вашей консоли) к вашему вопросу (используя ссылку редактирования под тегами). Кроме того, ваш комментарий не добавляет к вопросу. Может, удалить?
это множественное число, я удалил s по каким-то странным причинам, что касается одинарных кавычек, это дает мне ошибку, если я не помещаю их @muistooshort





У вас есть несколько проблем, первая из которых скрывает другие:
'schedule.from' и 'schedule.to' - это просто строки в SQL, а не ссылки на столбцы в таблице schedule.schedule должен быть schedules, поскольку Rails любит использовать множественное число для имен таблиц.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)
Спасибо за ответ, но я сделал все, что вы написали, и он по-прежнему возвращает пустой массив ...
@Anonymus Я бы хотел забыть о часовых поясах, они злые :)
Любая помощь будет оценена, если я что-то пропустил, скажите мне. Я знаю, что это немного запутано, но мне трудно объяснить себя ... так что я прошу прощения за любые ошибки, которые я сделал ...