Подтвердить что ты не робот

Как очистить фрагмент sql в Rails

Мне нужно дезинформировать часть SQL-запроса. Я могу сделать что-то вроде этого:

class << ActiveRecord::Base
  public :sanitize_sql
end

str = ActiveRecord::Base.sanitize_sql(["AND column1 = ?", "two's"], '')

Но это не безопасно, потому что я выставляю защищенный метод. Что это лучший способ сделать это?

4b9b3361

Ответ 1

Вы можете просто использовать:

ActiveRecord::Base::sanitize(string)

Ответ 2

ActiveRecord::Base.connection.quote делает ActiveRecord::Base.connection.quote дело в Rails 3.x

Ответ 3

Этот вопрос не указывает, что ответ должен исходить от ActiveRecord и не указывает, для какой версии Rails он должен быть. По этой причине (и потому что это один из лучших и немногих) ответов о том, как очистить параметры в Rails...


Вот решение, которое работает с Rails 4:

В ActiveRecord::Sanitization::ClassMethods вас есть sanitize_sql_for_conditions и два других его псевдонима: sanitize_conditions и sanitize_sql. Три делают буквально то же самое.

sanitize_sql_for_conditions

Принимает массив, хэш или строку условий SQL и очищает их в допустимый фрагмент SQL для предложения WHERE.

Также в ActiveRecord у вас есть

sanitize_sql_for_assignment который

Принимает массив, хэш или строку условий SQL и очищает их в допустимый фрагмент SQL для предложения SET.

  • Приведенные выше методы включены в ActiveRecord :: Base по умолчанию и, следовательно, включены в любую модель ActiveRecord.

Кроме того, однако, в ActionController у вас есть ActionController::Parameters который позволяет вам

выберите, какие атрибуты должны быть внесены в белый список для массового обновления и, таким образом, предотвратить случайное раскрытие того, что не должно быть выставлено. Предоставляет два метода для этой цели: требовать и разрешать.

params = ActionController::Parameters.new(user: { name: 'Bryan', age: 21 })
req  = params.require(:user) # will throw exception if user not present
opt  = params.permit(:name)  # name parameter is optional, returns nil if not present
user = params.require(:user).permit(:name, :age) # user hash is required while 'name' and 'age' keys are optional

"Магия параметров" называется "Сильные параметры" (здесь приведены документы), и вы можете использовать ее для очистки параметров в контроллере перед его отправкой в модель.

  • Методы выше включены по умолчанию в ActionController::Base и, следовательно, включены в любой контроллер Rails.

Я надеюсь, что это поможет любому, хотя бы для изучения и демистификации Rails! :)

Ответ 4

Вы можете обойти метод protected метода, косвенно косвенно:

str = ActiveRecord::Base.__send__(:sanitize_sql, ["AND column1 = ?", "two's"], '')

... который по крайней мере избавит вас от необходимости переделать этот метод как public.

(Я немного подозрительно, что вам действительно нужно это сделать, но выше будет работать.)

Ответ 5

Начиная с рельсов 5 рекомендуемым способом является использование: ActiveRecord::Base.connection.quote(string)

как указано здесь: https://github.com/rails/rails/issues/28947

ActiveRecord::Base::sanitize(string) устарела