Я бы посоветовал не использовать для этого интерполяцию строк, есть много острых краев, и вы, вероятно, получите больше удовольствия, покачивая яблоки в ведре с рыболовными крючками. Вы должны сделать это так:
Model.where(
'created_at >= :five_days_ago or updated_at >= :three_days_ago',
:five_days_ago => Time.now - 5.days,
:three_days_ago => Time.now - 3.days
)
Использование (хорошо) именованных заполнителей дает вам удобочитаемость и независимость позиции, которые, по вашему мнению, предлагает интерполяция строк, но приятно обходят проблемы с цитированием, часовым поясом и форматом, которые вызывают у вас силы интерполяции строк.
Но как безопасно использовать интерполяцию строк? Есть несколько вещей, с которыми вы должны справиться:
- Цитирование и экранирование.
- Форматы отметок времени.
- Может быть, часовые пояса тоже.
ActiveRecord позаботится обо всей этой ерунде для вас.
Не пытайтесь делать цитаты самостоятельно, используйте методы цитирования драйвера. У вас будет доступ к connection.quote
для правильного цитирования строк.
Любая база данных будет знать, что делать с метками времени ISO 8601 , и для этого есть удобный iso8601
метод. Стандарт ISO 8601 также включает часовой пояс, и база данных должна иметь возможность его анализировать (но если это невозможно, вам придется вручную преобразовать время в UTC с помощью .utc
).
Итак, чтобы быть в безопасности:
Model.where("created_at >= #{connection.quote((Time.now - 5.days).utc.iso8601)} " + \
"OR updated_at >= #{connection.quote((Time.now - 3.days).utc.iso8601)}")
Не так красиво сейчас? С отметками времени ISO 8601 вы должны безопасно заменить вызовы connection.quote
простыми одинарными кавычками:
Model.where("created_at >= '#{(Time.now - 5.days).utc.iso8601}' " + \
"OR updated_at >= '#{(Time.now - 3.days).utc.iso8601}'")
но у вас все еще много шума и уродства, и вы будете развивать вредные привычки.
Мы не проводим вечеринки, как программисты PHP в 1999 году, поэтому не поддавайтесь ложной лени, используя интерполяцию строк в вашем SQL, используйте именованные заполнители.