Учитывая объект запроса (не AR-модель)
class ComplexQuery
QUERY = <<-SQL
...
SQL
def new(param1, param2)
...
end
def execute
# format and interpolate parameters into QUERY
# pass finished SQL to `execute` or `select_all`
end
end
Как я могу легко избежать всех параметров?
Мне удалось выполнить три метода, но ни один из них не является удобным.
- Используйте
raw_connection, который (для меня) возвращает экземплярPG::Connи вызываетexec_params. Я не удовлетворен этим, потому чтоexec_paramsтребует подробного набора аргументов для указания типов данных. -
include ActiveRecord::Sanitizationв моем объекте запроса и используйте один из его удобных методов, напримерreplace_named_bind_variables. Я не удовлетворен этим, потому чтоreplace_named_bind_variablesестьprotected, и мне нужно использоватьsend. - Вместо этого напишите
module. По какой-то причине, когда яinclude ActiveRecord::Sanitizationв модуль, я могу использовать его защищенные методы. Я не удовлетворен этим, потому что я хочу иногда создавать экземпляр объекта запроса, не выполняя его, например. для тестирования.
Включение ActiveRecord::Sanitization в class кажется лучшим решением, но я должен делать что-то неправильно, потому что я должен использовать метод protected.
Я ищу решение, которое:
- выполняет несколько параметров
- предназначен для использования пользователями ActiveRecord
- указывает тип данных параметра и соответственно форматирует его.
Я смог найти некоторые связанные вопросы
- Эвакуация значений в Rails (аналогично mysql_real_escape_string()) обсуждает экранирование одного значения или предлагает
sending приватным методам. - Другой вопрос (Выбор ActiveRecord с привязкой параметров) показывает, как использовать
sanitize_sql_arrayв подклассе ActiveRecord:: Base, но мой вопрос здесь о отдельном объект запроса, а не AR-модель. - Как выполнить необработанное обновление sql с динамической привязкой в рельсах