Учитывая объект запроса (не 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()) обсуждает экранирование одного значения или предлагает
send
ing приватным методам. - Другой вопрос (Выбор ActiveRecord с привязкой параметров) показывает, как использовать
sanitize_sql_array
в подклассе ActiveRecord:: Base, но мой вопрос здесь о отдельном объект запроса, а не AR-модель. - Как выполнить необработанное обновление sql с динамической привязкой в рельсах