Я пытаюсь санировать строку, которая включает ввод данных пользователем, не имея необходимость обращаться к ручной обработке моего собственного возможно багги regex, если это возможно, однако, если бы это - единственный способ, которым я также ценил бы, если кто-либо может указать на меня в правильном направлении к regex, который вряд ли будет пропускать что-либо. Существует много методов в направляющих, которые могут позволить Вам входить в собственные команды SQL, как люди выходят из ввода данных пользователем для тех?
Вопросом, который я задаю, является широкий, но в моем особом случае, я работаю со столбцом в своей базе данных Postgres, которую исходно не понимают направляющие насколько я знаю, tsvector, который содержит информацию поиска простого текста. Направляющие могут записать и читать из него, как будто это - строка, однако, в отличие от строки, это, кажется, автоматически не выходит из него, когда я делаю вещи как вектор = в модели.
Например, когда я делаю model.name = '::', где имя является строкой, оно хорошо работает. Когда я делаю model.vector = '::' это ошибки:
ActiveRecord::StatementInvalid: PGError: ERROR: syntax error in tsvector: "::"
"vectors" = E'::' WHERE "id" = 1
Это, кажется, проблема, вызванная отсутствием выхода точек с запятой, и я могу вручную установить вектор = '::' прекрасный.
У меня также была прекрасная идея, возможно, я могу просто назвать что-то как:
ActiveRecord::Base.connection.execute "UPDATE medias SET vectors = ? WHERE id = 1", "::"
Однако этот синтаксис не работает, потому что необработанные команды SQL не имеют доступа к методу находки выхода и ввода строк при помощи? метка.
Это кажется мне той же проблемой звонящий connection.execute с любым типом ввода данных пользователем, как все это сводится к очистке строк, но я, может казаться, не нахожу способа вручную назвать строковые методы санитизации SQL направляющих. Кто-либо может предоставить консультацию?
Добавьте этот метод в свою модель:
class Media < ActiveRecord::Base
def self.execute_sql(*sql_array)
connection.execute(send(:sanitize_sql_array, sql_array))
end
end
Теперь вы можете выполнить любой SQL, например:
Media.execute_sql('UPDATE medias SET vectors = ? WHERE id = 1', '::')
Ссылка