Как переписать мой метод Ruby с синтаксисом Arel? - PullRequest
0 голосов
/ 02 февраля 2019

Я недавно обновился до Rails 5.2.X и теперь получаю предупреждение об устаревании:

ПРЕДУПРЕЖДЕНИЕ О УСТАРЕВАНИИ: опасный метод запроса (метод, аргументы которого используются как необработанный SQL), вызываемый сАргумент (ы) атрибута: "LOWER (projects.name) desc".Аргументы без атрибутов будут запрещены в Rails 6.0.Этот метод не должен вызываться с предоставленными пользователем значениями, такими как параметры запроса или атрибуты модели.Известные безопасные значения можно передать, обернув их в Arel.sql ().

Я знаю, что это сообщение об устаревании обсуждается здесь .

НоТем не менее я борюсь с правильным синтаксисом.

Это мой метод:

def optimized_sort_column
  column_type == :string ? "LOWER(#{unique_sort_column})" : unique_sort_column
end

Я пытался изменить его на:

def optimized_sort_column
  column_type == :string ? Arel.sql("lower(#{unique_sort_column})") : unique_sort_column
end

Но яя все еще получаю то же предупреждение об устаревании.

Что мне здесь не хватает?

1 Ответ

0 голосов
/ 02 февраля 2019

Можете ли вы попробовать это:

.order(
  Arel::Nodes::NamedFunction.new('lower', [unique_sort_column])
)

Я думаю, что выдает предупреждение, потому что интерполяция строки внутри строки, которую вы передаете Арлу (вероятно, не обрабатывается таким образом).

Я взял это из scuttle.io , изменив запрос по умолчанию на lower(author) и проверив локально с заменой имен переменных вместо автора.Это не бросает предупреждение.

...